1#ifndef SIMDJSON_PADDED_STRING_INL_H
2#define SIMDJSON_PADDED_STRING_INL_H
4#include "simdjson/padded_string.h"
5#include "simdjson/padded_string_view.h"
7#include "simdjson/error-inl.h"
8#include "simdjson/padded_string_view-inl.h"
22inline char *allocate_padded_buffer(
size_t length)
noexcept {
24 if(totalpaddedlength<length) {
28#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
30 if (totalpaddedlength>(1UL<<20)) {
35 char *padded_buffer =
new (std::nothrow)
char[totalpaddedlength];
36 if (padded_buffer ==
nullptr) {
41 std::memset(padded_buffer + length, 0, totalpaddedlength - length);
50 : viable_size(length), data_ptr(internal::allocate_padded_buffer(length)) {
53 : viable_size(length), data_ptr(internal::allocate_padded_buffer(length)) {
54 if ((data !=
nullptr) && (data_ptr !=
nullptr)) {
55 std::memcpy(data_ptr, data, length);
57 if (data_ptr ==
nullptr) {
63 : viable_size(length), data_ptr(internal::allocate_padded_buffer(length)) {
64 if ((data !=
nullptr) && (data_ptr !=
nullptr)) {
65 std::memcpy(data_ptr,
reinterpret_cast<const char *
>(data), length);
67 if (data_ptr ==
nullptr) {
74 : viable_size(str_.size()), data_ptr(internal::allocate_padded_buffer(str_.size())) {
75 if (data_ptr ==
nullptr) {
78 std::memcpy(data_ptr, str_.data(), str_.size());
83 : viable_size(sv_.size()), data_ptr(internal::allocate_padded_buffer(sv_.size())) {
84 if(simdjson_unlikely(!data_ptr)) {
90 std::memcpy(data_ptr, sv_.data(), sv_.size());
94 : viable_size(o.viable_size), data_ptr(o.data_ptr) {
101 data_ptr = o.data_ptr;
102 viable_size = o.viable_size;
103 o.data_ptr =
nullptr;
109 size_t tmp_viable_size = viable_size;
110 char *tmp_data_ptr = data_ptr;
111 viable_size = o.viable_size;
112 data_ptr = o.data_ptr;
113 o.data_ptr = tmp_data_ptr;
114 o.viable_size = tmp_viable_size;
117inline padded_string::~padded_string() noexcept {
129inline padded_string::operator std::string_view() const simdjson_lifetime_bound {
return std::string_view(data(), length()); }
137 SIMDJSON_PUSH_DISABLE_WARNINGS
138 SIMDJSON_DISABLE_DEPRECATED_WARNING
139 std::FILE *fp = std::fopen(filename.data(),
"rb");
140 SIMDJSON_POP_DISABLE_WARNINGS
148#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
149 ret = _fseeki64(fp, 0, SEEK_END);
151 ret = std::fseek(fp, 0, SEEK_END);
157#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
158 __int64 llen = _ftelli64(fp);
164 long llen = std::ftell(fp);
165 if((llen < 0) || (llen == LONG_MAX)) {
172 size_t len =
static_cast<size_t>(llen);
174 if (s.
data() ==
nullptr) {
181 size_t bytes_read = std::fread(s.
data(), 1, len, fp);
182 if (std::fclose(fp) != 0 || bytes_read != len) {
189#if defined(_WIN32) && SIMDJSON_CPLUSPLUS17
192 SIMDJSON_PUSH_DISABLE_WARNINGS
193 SIMDJSON_DISABLE_DEPRECATED_WARNING
194 std::FILE *fp = _wfopen(filename.data(), L
"rb");
195 SIMDJSON_POP_DISABLE_WARNINGS
203#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
204 ret = _fseeki64(fp, 0, SEEK_END);
206 ret = std::fseek(fp, 0, SEEK_END);
212#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
213 __int64 llen = _ftelli64(fp);
219 long llen = std::ftell(fp);
220 if((llen < 0) || (llen == LONG_MAX)) {
227 size_t len =
static_cast<size_t>(llen);
228 padded_string s(len);
229 if (s.data() ==
nullptr) {
236 size_t bytes_read = std::fread(s.data(), 1, len, fp);
237 if (std::fclose(fp) != 0 || bytes_read != len) {
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.
@ MEMALLOC
Error allocating memory, most likely out of memory.
@ IO_ERROR
Error reading a file.
constexpr size_t SIMDJSON_PADDING
The amount of padding needed in a buffer to parse JSON.
String with extra allocation for ease of use with parser::parse()
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.