14 #ifndef LLVM_CLANG_REWRITE_CORE_REWRITEROPE_H 15 #define LLVM_CLANG_REWRITE_CORE_REWRITEROPE_H 17 #include "llvm/ADT/IntrusiveRefCntPtr.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/Support/Compiler.h" 41 assert(RefCount > 0 &&
"Reference count is already zero.");
43 delete [] (
char*)
this;
64 RopePiece() : StrData(nullptr), StartOffs(0), EndOffs(0) {}
68 : StrData(
std::move(Str)), StartOffs(Start), EndOffs(End) {}
71 return StrData->Data[Offset+StartOffs];
74 return StrData->Data[Offset+StartOffs];
77 unsigned size()
const {
return EndOffs-StartOffs; }
89 public std::iterator<std::forward_iterator_tag, const char, ptrdiff_t> {
102 : CurNode(nullptr), CurPiece(nullptr), CurChar(0) {}
105 return (*CurPiece)[CurChar];
109 return CurPiece == RHS.CurPiece && CurChar == RHS.CurChar;
116 if (CurChar+1 < CurPiece->
size())
127 return llvm::StringRef(&(*CurPiece)[0], CurPiece->
size());
130 void MoveToNextPiece();
146 iterator
begin()
const {
return iterator(Root); }
147 iterator
end()
const {
return iterator(); }
148 unsigned size()
const;
149 unsigned empty()
const {
return size() == 0; }
155 void erase(
unsigned Offset,
unsigned NumBytes);
172 enum { AllocChunkSize = 4080 };
175 RewriteRope() : AllocBuffer(nullptr), AllocOffs(AllocChunkSize) {}
177 : Chunks(RHS.Chunks), AllocBuffer(nullptr), AllocOffs(AllocChunkSize) {
183 iterator
end()
const {
return Chunks.
end(); }
193 Chunks.
insert(0, MakeRopeString(Start, End));
197 assert(Offset <= size() &&
"Invalid position to insert!");
198 if (Start == End)
return;
199 Chunks.
insert(Offset, MakeRopeString(Start, End));
203 assert(Offset+NumBytes <= size() &&
"Invalid region to erase!");
204 if (NumBytes == 0)
return;
205 Chunks.
erase(Offset, NumBytes);
209 RopePiece MakeRopeString(
const char *Start,
const char *
End);
void insert(unsigned Offset, const char *Start, const char *End)
bool operator==(CanQual< T > x, CanQual< U > y)
void insert(unsigned Offset, const RopePiece &R)
RewriteRope - A powerful string class.
RopePieceBTree::iterator iterator
llvm::StringRef piece() const
void erase(unsigned Offset, unsigned NumBytes)
RopePieceBTreeIterator & operator++()
RopeRefCountString - This struct is allocated with 'new char[]' from the heap, and represents a refer...
const char & operator[](unsigned Offset) const
RopePiece - This class represents a view into a RopeRefCountString object.
llvm::IntrusiveRefCntPtr< RopeRefCountString > StrData
void erase(unsigned Offset, unsigned NumBytes)
RopePieceBTree::iterator const_iterator
RopePieceBTreeIterator iterator
RewriteRope(const RewriteRope &RHS)
RopePiece(llvm::IntrusiveRefCntPtr< RopeRefCountString > Str, unsigned Start, unsigned End)
Dataflow Directional Tag Classes.
RopePieceBTreeIterator - This class provides read-only forward iteration over bytes that are in a Rop...
bool operator==(const RopePieceBTreeIterator &RHS) const
void assign(const char *Start, const char *End)
char & operator[](unsigned Offset)
RopePieceBTreeIterator operator++(int)
bool operator!=(const RopePieceBTreeIterator &RHS) const