summaryrefslogtreecommitdiffstats
path: root/third_party/wasm2c/src/string-view.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
commit43a97878ce14b72f0981164f87f2e35e14151312 (patch)
tree620249daf56c0258faa40cbdcf9cfba06de2a846 /third_party/wasm2c/src/string-view.h
parentInitial commit. (diff)
downloadfirefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz
firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/wasm2c/src/string-view.h')
-rw-r--r--third_party/wasm2c/src/string-view.h347
1 files changed, 347 insertions, 0 deletions
diff --git a/third_party/wasm2c/src/string-view.h b/third_party/wasm2c/src/string-view.h
new file mode 100644
index 0000000000..534e675c73
--- /dev/null
+++ b/third_party/wasm2c/src/string-view.h
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2017 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef WABT_STRING_VIEW_H_
+#define WABT_STRING_VIEW_H_
+
+#include <cassert>
+#include <functional>
+#include <iterator>
+#include <ostream>
+#include <string>
+
+#include "src/hash-util.h"
+
+namespace wabt {
+
+// This is a simplified implemention of C++17's basic_string_view template.
+//
+// Missing features:
+// * Not a template
+// * No allocator support
+// * Some functions are not implemented
+// * Asserts instead of exceptions
+// * Some functions are not constexpr because we don't compile in C++17 mode
+
+class string_view {
+ public:
+ typedef std::char_traits<char> traits_type;
+ typedef char value_type;
+ typedef char* pointer;
+ typedef const char* const_pointer;
+ typedef char& reference;
+ typedef const char& const_reference;
+ typedef const char* const_iterator;
+ typedef const_iterator iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef const_reverse_iterator reverse_iterator;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+ static const size_type npos = size_type(-1);
+
+ // construction and assignment
+ constexpr string_view() noexcept;
+ constexpr string_view(const string_view&) noexcept = default;
+ string_view& operator=(const string_view&) noexcept = default;
+ string_view(const std::string& str) noexcept;
+ /*constexpr*/ string_view(const char* str);
+ constexpr string_view(const char* str, size_type len);
+
+ // iterator support
+ constexpr const_iterator begin() const noexcept;
+ constexpr const_iterator end() const noexcept;
+ constexpr const_iterator cbegin() const noexcept;
+ constexpr const_iterator cend() const noexcept;
+ const_reverse_iterator rbegin() const noexcept;
+ const_reverse_iterator rend() const noexcept;
+ const_reverse_iterator crbegin() const noexcept;
+ const_reverse_iterator crend() const noexcept;
+
+ // capacity
+ constexpr size_type size() const noexcept;
+ constexpr size_type length() const noexcept;
+ constexpr size_type max_size() const noexcept;
+ constexpr bool empty() const noexcept;
+
+ // element access
+ constexpr const_reference operator[](size_type pos) const;
+ /*constexpr*/ const_reference at(size_type pos) const;
+ /*constexpr*/ const_reference front() const;
+ /*constexpr*/ const_reference back() const;
+ constexpr const_pointer data() const noexcept;
+
+ // modifiers
+ /*constexpr*/ void remove_prefix(size_type n);
+ /*constexpr*/ void remove_suffix(size_type n);
+ /*constexpr*/ void swap(string_view& s) noexcept;
+
+ // string operations
+ explicit operator std::string() const;
+ std::string to_string() const;
+ size_type copy(char* s, size_type n, size_type pos = 0) const;
+ /*constexpr*/ string_view substr(size_type pos = 0, size_type n = npos) const;
+ /*constexpr*/ int compare(string_view s) const noexcept;
+ /*constexpr*/ int compare(size_type pos1, size_type n1, string_view s) const;
+ /*constexpr*/ int compare(size_type pos1,
+ size_type n1,
+ string_view s,
+ size_type pos2,
+ size_type n2) const;
+ /*constexpr*/ int compare(const char* s) const;
+ /*constexpr*/ int compare(size_type pos1, size_type n1, const char* s) const;
+ /*constexpr*/ int compare(size_type pos1,
+ size_type n1,
+ const char* s,
+ size_type n2) const;
+ /*constexpr*/ size_type find(string_view s, size_type pos = 0) const noexcept;
+ /*constexpr*/ size_type find(char c, size_type pos = 0) const noexcept;
+ /*constexpr*/ size_type find(const char* s, size_type pos, size_type n) const;
+ /*constexpr*/ size_type find(const char* s, size_type pos = 0) const;
+ /*constexpr*/ size_type rfind(string_view s, size_type pos = npos) const
+ noexcept;
+ /*constexpr*/ size_type rfind(char c, size_type pos = npos) const noexcept;
+ /*constexpr*/ size_type rfind(const char* s,
+ size_type pos,
+ size_type n) const;
+ /*constexpr*/ size_type rfind(const char* s, size_type pos = npos) const;
+ /*constexpr*/ size_type find_first_of(string_view s, size_type pos = 0) const
+ noexcept;
+ /*constexpr*/ size_type find_first_of(char c, size_type pos = 0) const
+ noexcept;
+ /*constexpr*/ size_type find_first_of(const char* s,
+ size_type pos,
+ size_type n) const;
+ /*constexpr*/ size_type find_first_of(const char* s, size_type pos = 0) const;
+ /*constexpr*/ size_type find_last_of(string_view s,
+ size_type pos = npos) const noexcept;
+ /*constexpr*/ size_type find_last_of(char c, size_type pos = npos) const
+ noexcept;
+ /*constexpr*/ size_type find_last_of(const char* s,
+ size_type pos,
+ size_type n) const;
+ /*constexpr*/ size_type find_last_of(const char* s,
+ size_type pos = npos) const;
+
+// TODO(binji): These are defined by C++17 basic_string_view but not
+// implemented here.
+#if 0
+ constexpr size_type find_first_not_of(string_view s, size_type pos = 0) const
+ noexcept;
+ constexpr size_type find_first_not_of(char c, size_type pos = 0) const
+ noexcept;
+ constexpr size_type find_first_not_of(const char* s,
+ size_type pos,
+ size_type n) const;
+ constexpr size_type find_first_not_of(const char* s, size_type pos = 0) const;
+ constexpr size_type find_last_not_of(string_view s,
+ size_type pos = npos) const noexcept;
+ constexpr size_type find_last_not_of(char c, size_type pos = npos) const
+ noexcept;
+ constexpr size_type find_last_not_of(const char* s,
+ size_type pos,
+ size_type n) const;
+ constexpr size_type find_last_not_of(const char* s,
+ size_type pos = npos) const;
+#endif
+
+ private:
+ const char* data_;
+ size_type size_;
+};
+
+// non-member comparison functions
+inline bool operator==(string_view x, string_view y) noexcept {
+ return x.compare(y) == 0;
+}
+
+inline bool operator!=(string_view x, string_view y) noexcept {
+ return x.compare(y) != 0;
+}
+
+inline bool operator<(string_view x, string_view y) noexcept {
+ return x.compare(y) < 0;
+}
+
+inline bool operator>(string_view x, string_view y) noexcept {
+ return x.compare(y) > 0;
+}
+
+inline bool operator<=(string_view x, string_view y) noexcept {
+ return x.compare(y) <= 0;
+}
+
+inline bool operator>=(string_view x, string_view y) noexcept {
+ return x.compare(y) >= 0;
+}
+
+// non-member append.
+inline std::string& operator+=(std::string& x, string_view y) {
+ x.append(y.data(), y.size());
+ return x;
+}
+
+inline std::string operator+(string_view x, string_view y) {
+ std::string s;
+ s.reserve(x.size() + y.size());
+ s.append(x.data(), x.size());
+ s.append(y.data(), y.size());
+ return s;
+}
+
+inline std::string operator+(const std::string& x, string_view y) {
+ return string_view(x) + y;
+}
+
+inline std::string operator+(string_view x, const std::string& y) {
+ return x + string_view(y);
+}
+
+inline std::string operator+(const char* x, string_view y) {
+ return string_view(x) + y;
+}
+
+inline std::string operator+(string_view x, const char* y) {
+ return x + string_view(y);
+}
+
+inline void cat_concatenate(std::string&) {}
+
+template<typename T, typename ...Ts>
+void cat_concatenate(std::string& s, const T& t, const Ts&... args) {
+ s += t;
+ cat_concatenate(s, args...);
+}
+
+inline size_t cat_compute_size() { return 0; }
+
+template<typename T, typename ...Ts>
+size_t cat_compute_size(const T& t, const Ts&... args) {
+ return string_view(t).size() + cat_compute_size(args...);
+}
+
+// Is able to concatenate any combination of string/string_view/char*
+template<typename ...Ts> std::string cat(const Ts&... args) {
+ std::string s;
+ s.reserve(cat_compute_size(args...));
+ cat_concatenate(s, args...);
+ return s;
+}
+
+inline constexpr string_view::string_view() noexcept
+ : data_(nullptr), size_(0) {}
+
+inline string_view::string_view(const std::string& str) noexcept
+ : data_(str.data()), size_(str.size()) {}
+
+inline string_view::string_view(const char* str)
+ : data_(str), size_(traits_type::length(str)) {}
+
+inline constexpr string_view::string_view(const char* str, size_type len)
+ : data_(str), size_(len) {}
+
+inline constexpr string_view::const_iterator string_view::begin() const
+ noexcept {
+ return data_;
+}
+
+inline constexpr string_view::const_iterator string_view::end() const noexcept {
+ return data_ + size_;
+}
+
+inline constexpr string_view::const_iterator string_view::cbegin() const
+ noexcept {
+ return data_;
+}
+
+inline constexpr string_view::const_iterator string_view::cend() const
+ noexcept {
+ return data_ + size_;
+}
+
+inline string_view::const_reverse_iterator string_view::rbegin() const
+ noexcept {
+ return const_reverse_iterator(end());
+}
+
+inline string_view::const_reverse_iterator string_view::rend() const noexcept {
+ return const_reverse_iterator(begin());
+}
+
+inline string_view::const_reverse_iterator string_view::crbegin() const
+ noexcept {
+ return const_reverse_iterator(cend());
+}
+
+inline string_view::const_reverse_iterator string_view::crend() const noexcept {
+ return const_reverse_iterator(cbegin());
+}
+
+constexpr inline string_view::size_type string_view::size() const noexcept {
+ return size_;
+}
+
+constexpr inline string_view::size_type string_view::length() const noexcept {
+ return size_;
+}
+
+constexpr inline bool string_view::empty() const noexcept {
+ return size_ == 0;
+}
+
+constexpr inline string_view::const_reference string_view::operator[](
+ size_type pos) const {
+ return data_[pos];
+}
+
+inline string_view::const_reference string_view::at(size_type pos) const {
+ assert(pos < size_);
+ return data_[pos];
+}
+
+inline string_view::const_reference string_view::front() const {
+ assert(!empty());
+ return *data_;
+}
+
+inline string_view::const_reference string_view::back() const {
+ assert(!empty());
+ return data_[size_ - 1];
+}
+
+constexpr inline string_view::const_pointer string_view::data() const noexcept {
+ return data_;
+}
+
+inline std::ostream& operator<<(std::ostream& os, string_view sv) {
+ os.write(sv.data(), sv.size());
+ return os;
+}
+
+} // namespace wabt
+
+namespace std {
+
+// hash support
+template <>
+struct hash<::wabt::string_view> {
+ ::wabt::hash_code operator()(const ::wabt::string_view& sv) {
+ return ::wabt::HashRange(sv.begin(), sv.end());
+ }
+};
+
+} // namespace std
+
+#endif // WABT_STRING_VIEW_H_