Coverage Report

Created: 2024-09-08 06:19

/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