Minh Nguyen / ArduinoJson
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers StringCopier.hpp Source File

StringCopier.hpp

00001 // ArduinoJson - arduinojson.org
00002 // Copyright Benoit Blanchon 2014-2021
00003 // MIT License
00004 
00005 #pragma once
00006 
00007 #include <ArduinoJson/Memory/MemoryPool.hpp>
00008 
00009 namespace ARDUINOJSON_NAMESPACE {
00010 
00011 class StringCopier {
00012  public:
00013   StringCopier(MemoryPool& pool) : _pool(&pool) {}
00014 
00015   void startString() {
00016     _pool->getFreeZone(&_ptr, &_capacity);
00017     _size = 0;
00018   }
00019 
00020   const char* save() {
00021     ARDUINOJSON_ASSERT(_ptr);
00022     return _pool->saveStringFromFreeZone(_size);
00023   }
00024 
00025   void append(const char* s) {
00026     while (*s) append(*s++);
00027   }
00028 
00029   void append(const char* s, size_t n) {
00030     while (n-- > 0) append(*s++);
00031   }
00032 
00033   void append(char c) {
00034     if (!_ptr)
00035       return;
00036 
00037     if (_size >= _capacity) {
00038       _ptr = 0;
00039       _pool->markAsOverflowed();
00040       return;
00041     }
00042 
00043     _ptr[_size++] = c;
00044   }
00045 
00046   bool isValid() {
00047     return _ptr != 0;
00048   }
00049 
00050   const char* c_str() {
00051     return _ptr;
00052   }
00053 
00054   typedef storage_policies::store_by_copy storage_policy;
00055 
00056  private:
00057   MemoryPool* _pool;
00058   char* _ptr;
00059   size_t _size;
00060   size_t _capacity;
00061 };
00062 }  // namespace ARDUINOJSON_NAMESPACE