simdjson  3.7.0
Ridiculously Fast JSON
padded_string.h
1 #ifndef SIMDJSON_PADDED_STRING_H
2 #define SIMDJSON_PADDED_STRING_H
3 
4 #include "simdjson/base.h"
5 #include "simdjson/error.h"
6 
7 #include "simdjson/error-inl.h"
8 
9 #include <cstring>
10 #include <memory>
11 #include <string>
12 #include <ostream>
13 
14 namespace simdjson {
15 
16 class padded_string_view;
17 
23 struct padded_string final {
24 
28  explicit inline padded_string() noexcept;
34  explicit inline padded_string(size_t length) noexcept;
41  explicit inline padded_string(const char *data, size_t length) noexcept;
42 #ifdef __cpp_char8_t
43  explicit inline padded_string(const char8_t *data, size_t length) noexcept;
44 #endif
50  inline padded_string(const std::string & str_ ) noexcept;
56  inline padded_string(std::string_view sv_) noexcept;
64  inline padded_string(padded_string &&o) noexcept;
72  inline padded_string &operator=(padded_string &&o) noexcept;
73  inline void swap(padded_string &o) noexcept;
74  ~padded_string() noexcept;
75 
81  size_t size() const noexcept;
82 
88  size_t length() const noexcept;
89 
93  const char *data() const noexcept;
94  const uint8_t *u8data() const noexcept { return static_cast<const uint8_t*>(static_cast<const void*>(data_ptr));}
95 
99  char *data() noexcept;
100 
104  operator std::string_view() const;
105 
109  operator padded_string_view() const noexcept;
110 
119  inline static simdjson_result<padded_string> load(std::string_view path) noexcept;
120 
121 private:
122  padded_string &operator=(const padded_string &o) = delete;
123  padded_string(const padded_string &o) = delete;
124 
125  size_t viable_size{0};
126  char *data_ptr{nullptr};
127 
128 }; // padded_string
129 
137 inline std::ostream& operator<<(std::ostream& out, const padded_string& s) { return out << s.data(); }
138 
139 #if SIMDJSON_EXCEPTIONS
149 inline std::ostream& operator<<(std::ostream& out, simdjson_result<padded_string> &s) noexcept(false) { return out << s.value(); }
150 #endif
151 
152 } // namespace simdjson
153 
154 // This is deliberately outside of simdjson so that people get it without having to use the namespace
155 inline simdjson::padded_string operator "" _padded(const char *str, size_t len);
156 #ifdef __cpp_char8_t
157 inline simdjson::padded_string operator "" _padded(const char8_t *str, size_t len);
158 #endif
159 
160 namespace simdjson {
161 namespace internal {
162 
163 // The allocate_padded_buffer function is a low-level function to allocate memory
164 // with padding so we can read past the "length" bytes safely. It is used by
165 // the padded_string class automatically. It returns nullptr in case
166 // of error: the caller should check for a null pointer.
167 // The length parameter is the maximum size in bytes of the string.
168 // The caller is responsible to free the memory (e.g., delete[] (...)).
169 inline char *allocate_padded_buffer(size_t length) noexcept;
170 
171 } // namespace internal
172 } // namespace simdjson
173 
174 #endif // SIMDJSON_PADDED_STRING_H
User-provided string that promises it has extra padded bytes at the end for use with parser::parse().
The top level simdjson namespace, containing everything the library provides.
Definition: base.h:8
std::ostream & operator<<(std::ostream &out, error_code error) noexcept
Write the error message to the output stream.
Definition: error-inl.h:35
String with extra allocation for ease of use with parser::parse()
Definition: padded_string.h:23
size_t size() const noexcept
The length of the string.
size_t length() const noexcept
The length of the string.
padded_string() noexcept
Create a new, empty padded string.
padded_string & operator=(padded_string &&o) noexcept
Move one padded string into another.
const char * data() const noexcept
The string data.
static simdjson_result< padded_string > load(std::string_view path) noexcept
Load this padded string from a file.
The result of a simdjson operation that could fail.
Definition: error.h:215