raw_item.cpp (1691B)
1 #include "raw_item.hpp" 2 #include "context.hpp" 3 #include <iomanip> 4 5 namespace Neptools 6 { 7 8 void RawItem::Dump_(Sink& sink) const 9 { 10 src.Dump(sink); 11 } 12 13 void RawItem::Inspect_(std::ostream& os, unsigned indent) const 14 { 15 Item::Inspect_(os, indent); 16 os << "raw(" << Quoted(src) << ")"; 17 } 18 19 Libshit::NotNull<Libshit::RefCountedPtr<RawItem>> RawItem::InternalSlice( 20 FilePosition spos, FilePosition slen) 21 { 22 LIBSHIT_ASSERT(spos+slen <= GetSize()); 23 auto ctx = GetContext(); 24 return ctx->Create<RawItem>(Source{src, spos, slen}, position+spos); 25 } 26 27 // split into 3 parts: 0...pos, pos...pos+nitem size, pos+nitem size...this size 28 void RawItem::Split2( 29 FilePosition pos, Libshit::NotNull<Libshit::SmartPtr<Item>> nitem) 30 { 31 auto len = nitem->GetSize(); 32 LIBSHIT_ASSERT(pos <= GetSize() && pos+len <= GetSize()); 33 auto rem_len = GetSize() - len - pos; 34 35 if (pos == 0 && rem_len == 0) 36 { 37 Replace(std::move(nitem)); 38 return; 39 } 40 41 SliceSeq seq; 42 if (pos != 0) seq.emplace_back(MakeNotNull(this), pos); 43 seq.emplace_back(std::move(nitem), pos+len); 44 if (rem_len > 0) 45 if (pos == 0) 46 seq.emplace_back(MakeNotNull(this), GetSize()); 47 else 48 seq.emplace_back(InternalSlice(pos+len, rem_len), GetSize()); 49 50 Item::Slice(std::move(seq)); 51 if (pos == 0) 52 { 53 LIBSHIT_ASSERT(rem_len > 0); 54 src.Slice(len, rem_len); 55 } 56 else 57 src.Slice(0, pos); 58 } 59 60 RawItem& RawItem::Split(FilePosition offset, FilePosition size) 61 { 62 auto it = InternalSlice(offset, size); 63 auto& ret = *it; 64 Split2(offset, std::move(it)); 65 return ret; 66 } 67 68 } 69 70 #include "raw_item.binding.hpp"