diff options
Diffstat (limited to 'Utilities/cmcppdap/src/string_buffer.h')
-rw-r--r-- | Utilities/cmcppdap/src/string_buffer.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Utilities/cmcppdap/src/string_buffer.h b/Utilities/cmcppdap/src/string_buffer.h new file mode 100644 index 0000000..cdd6c41 --- /dev/null +++ b/Utilities/cmcppdap/src/string_buffer.h @@ -0,0 +1,85 @@ +// Copyright 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef dap_string_buffer_h +#define dap_string_buffer_h + +#include "dap/io.h" + +#include <algorithm> // std::min +#include <cstring> // memcpy +#include <memory> // std::unique_ptr +#include <string> + +namespace dap { + +class StringBuffer : public virtual Reader, public virtual Writer { + public: + static inline std::unique_ptr<StringBuffer> create(); + + inline bool write(const std::string& s); + inline std::string string() const; + + // Reader / Writer compilance + inline bool isOpen() override; + inline void close() override; + inline size_t read(void* buffer, size_t bytes) override; + inline bool write(const void* buffer, size_t bytes) override; + + private: + std::string str; + bool closed = false; +}; + +bool StringBuffer::isOpen() { + return !closed; +} +void StringBuffer::close() { + closed = true; +} + +std::unique_ptr<StringBuffer> StringBuffer::create() { + return std::unique_ptr<StringBuffer>(new StringBuffer()); +} + +bool StringBuffer::write(const std::string& s) { + return write(s.data(), s.size()); +} + +std::string StringBuffer::string() const { + return str; +} + +size_t StringBuffer::read(void* buffer, size_t bytes) { + if (closed || bytes == 0 || str.size() == 0) { + return 0; + } + auto len = std::min(bytes, str.size()); + memcpy(buffer, str.data(), len); + str = std::string(str.begin() + len, str.end()); + return len; +} + +bool StringBuffer::write(const void* buffer, size_t bytes) { + if (closed) { + return false; + } + auto chars = reinterpret_cast<const char*>(buffer); + str.append(chars, chars + bytes); + return true; +} + +} // namespace dap + +#endif // dap_string_buffer_h |