1 //===-- include/flang/Parser/char-buffer.h ----------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef FORTRAN_PARSER_CHAR_BUFFER_H_ 10 #define FORTRAN_PARSER_CHAR_BUFFER_H_ 11 12 // Defines a simple expandable buffer suitable for efficiently accumulating 13 // a stream of bytes. 14 15 #include <cstddef> 16 #include <list> 17 #include <string> 18 #include <utility> 19 #include <vector> 20 21 namespace Fortran::parser { 22 23 class CharBuffer { 24 public: CharBuffer()25 CharBuffer() {} CharBuffer(CharBuffer && that)26 CharBuffer(CharBuffer &&that) 27 : blocks_(std::move(that.blocks_)), bytes_{that.bytes_}, 28 lastBlockEmpty_{that.lastBlockEmpty_} { 29 that.clear(); 30 } 31 CharBuffer &operator=(CharBuffer &&that) { 32 blocks_ = std::move(that.blocks_); 33 bytes_ = that.bytes_; 34 lastBlockEmpty_ = that.lastBlockEmpty_; 35 that.clear(); 36 return *this; 37 } 38 empty()39 bool empty() const { return bytes_ == 0; } bytes()40 std::size_t bytes() const { return bytes_; } 41 clear()42 void clear() { 43 blocks_.clear(); 44 bytes_ = 0; 45 lastBlockEmpty_ = false; 46 } 47 48 char *FreeSpace(std::size_t &); 49 void Claim(std::size_t); 50 51 // The return value is the byte offset of the new data, 52 // i.e. the value of size() before the call. 53 std::size_t Put(const char *data, std::size_t n); 54 std::size_t Put(const std::string &); Put(char x)55 std::size_t Put(char x) { return Put(&x, 1); } 56 57 std::string Marshal() const; 58 59 private: 60 struct Block { 61 static constexpr std::size_t capacity{1 << 20}; 62 char data[capacity]; 63 }; 64 LastBlockOffset()65 int LastBlockOffset() const { return bytes_ % Block::capacity; } 66 std::list<Block> blocks_; 67 std::size_t bytes_{0}; 68 bool lastBlockEmpty_{false}; 69 }; 70 } // namespace Fortran::parser 71 #endif // FORTRAN_PARSER_CHAR_BUFFER_H_ 72