/src/arduinojson/src/ArduinoJson/Memory/StringBuffer.hpp
Line | Count | Source |
1 | | // ArduinoJson - https://arduinojson.org |
2 | | // Copyright © 2014-2024, Benoit BLANCHON |
3 | | // MIT License |
4 | | |
5 | | #pragma once |
6 | | |
7 | | #include <ArduinoJson/Memory/ResourceManager.hpp> |
8 | | |
9 | | ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE |
10 | | |
11 | | class StringBuffer { |
12 | | public: |
13 | 1.46k | StringBuffer(ResourceManager* resources) : resources_(resources) {} |
14 | | |
15 | 1.46k | ~StringBuffer() { |
16 | 1.46k | if (node_) |
17 | 378 | resources_->destroyString(node_); |
18 | 1.46k | } |
19 | | |
20 | 6.16k | char* reserve(size_t capacity) { |
21 | 6.16k | if (node_ && capacity > node_->length) { |
22 | | // existing buffer is too small, we need to reallocate |
23 | 284 | resources_->destroyString(node_); |
24 | 284 | node_ = nullptr; |
25 | 284 | } |
26 | 6.16k | if (!node_) |
27 | 1.84k | node_ = resources_->createString(capacity); |
28 | 6.16k | if (!node_) |
29 | 91 | return nullptr; |
30 | 6.07k | size_ = capacity; |
31 | 6.07k | node_->data[capacity] = 0; // null-terminate the string |
32 | 6.07k | return node_->data; |
33 | 6.16k | } |
34 | | |
35 | 5.88k | StringNode* save() { |
36 | 5.88k | ARDUINOJSON_ASSERT(node_ != nullptr); |
37 | 5.88k | node_->data[size_] = 0; |
38 | 5.88k | auto node = resources_->getString(adaptString(node_->data, size_)); |
39 | 5.88k | if (node) { |
40 | 4.78k | node->references++; |
41 | 4.78k | return node; |
42 | 4.78k | } |
43 | | |
44 | 1.09k | if (node_->length != size_) { |
45 | 68 | node = resources_->resizeString(node_, size_); |
46 | 68 | ARDUINOJSON_ASSERT(node != nullptr); // realloc to smaller can't fail |
47 | 1.02k | } else { |
48 | 1.02k | node = node_; |
49 | 1.02k | } |
50 | 1.09k | node_ = nullptr; |
51 | 1.09k | resources_->saveString(node); |
52 | 1.09k | return node; |
53 | 1.09k | } |
54 | | |
55 | 2.10k | JsonString str() const { |
56 | 2.10k | ARDUINOJSON_ASSERT(node_ != nullptr); |
57 | | |
58 | 2.10k | return JsonString(node_->data, node_->length, JsonString::Copied); |
59 | 2.10k | } |
60 | | |
61 | | private: |
62 | | ResourceManager* resources_; |
63 | | StringNode* node_ = nullptr; |
64 | | size_t size_ = 0; |
65 | | }; |
66 | | |
67 | | ARDUINOJSON_END_PRIVATE_NAMESPACE |