neptools

Modding tools to Neptunia games
git clone https://git.neptards.moe/neptards/neptools.git
Log | Files | Refs | Submodules | README | LICENSE

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"