"Fossies" - the Fresh Open Source Software Archive

Member "xdelta3-3.0.11/testing/segment.h" (24 Mar 2015, 2218 Bytes) of package /linux/misc/xdelta3-3.0.11.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 // -*- Mode: C++ -*-
    2 
    3 class Segment {
    4  public:
    5   Segment(size_t size, MTRandom *rand)
    6     : size_(size),
    7       seed_(rand->Rand32()),
    8       seed_offset_(0),
    9       data_(NULL) {
   10     CHECK_GT(size_, 0);
   11   }
   12 
   13   Segment(size_t size, uint32_t seed)
   14     : size_(size),
   15       seed_(seed),
   16       seed_offset_(0),
   17       data_(NULL) {
   18     CHECK_GT(size_, 0);
   19   }
   20 
   21   Segment(size_t size, uint8_t *data)
   22     : size_(size),
   23       seed_(0),
   24       seed_offset_(0),
   25       data_(data) {
   26     CHECK_GT(size_, 0);
   27   }
   28 
   29   size_t Size() const {
   30     return size_;
   31   }
   32 
   33   Segment Subseg(size_t start, size_t size) const {
   34     CHECK_LE(start + size, size_);
   35     if (data_) {
   36       return Segment(size, data_ + start);
   37     } else {
   38       return Segment(size, seed_, seed_offset_ + start);
   39     }
   40   }
   41 
   42   void Fill(size_t seg_offset, size_t size, uint8_t *data) const {
   43     CHECK_LE(seg_offset + size, size_);
   44     if (data_) {
   45       memcpy(data, data_ + seg_offset, size);
   46     } else {
   47       size_t skip = seg_offset + seed_offset_;
   48       MTRandom gen(seed_);
   49       MTRandom8 gen8(&gen);
   50       while (skip--) {
   51     gen8.Rand8();
   52       }
   53       for (size_t i = 0; i < size; i++) {
   54     data[i] = gen8.Rand8();
   55       }
   56     }
   57   }
   58 
   59   string ToString() const {
   60     string r;
   61     if (data_) {
   62       for (size_t i = 0; i < size_; i++) {
   63     char buf[10];
   64     sprintf(buf, "%02x ", data_[i]);
   65     r.append(buf);
   66       }
   67     } else {
   68       char buf[256];
   69       sprintf(buf, "size=%ld,seed=%ud,skip=%ld", size_, seed_, seed_offset_);
   70       r.append(buf);
   71     }
   72     return r;
   73   }
   74 
   75 private:
   76   // Used by Subseg()
   77   Segment(size_t size, uint32_t seed, size_t seed_offset)
   78     : size_(size),
   79       seed_(seed),
   80       seed_offset_(seed_offset),
   81       data_(NULL) {
   82     CHECK_GT(size_, 0);
   83   }
   84 
   85   size_t size_;  // Size of this segment
   86 
   87   // For random segments
   88   uint32_t seed_;  // Seed used for generating byte sequence
   89   size_t seed_offset_;  // Seed positions the sequence this many bytes
   90                         // before its beginning.
   91 
   92   // For literal segments (data is not owned)
   93   uint8_t *data_;
   94 };
   95 
   96 typedef map<xoff_t, Segment> SegmentMap;
   97 typedef typename SegmentMap::const_iterator ConstSegmentMapIterator;
   98 typedef typename SegmentMap::iterator SegmentMapIterator;