X-Git-Url: http://git.vrable.net/?p=cumulus.git;a=blobdiff_plain;f=ref.h;h=a27b4d6a1fedb0a373452a7128cff7e9fbf85332;hp=deae39c9ddea503dceab35255d3c1218aebe8da5;hb=f38dd9bcb0caffd3fc9126b05788c936690e8288;hpb=0dfc70e01ddb7d2bce0db03d5364c0bd3a2bb308 diff --git a/ref.h b/ref.h index deae39c..a27b4d6 100644 --- a/ref.h +++ b/ref.h @@ -55,9 +55,12 @@ * a substring rather than the entire string using a range specifier. If no * range specifier is given, then by default the entire object is used. * ::= "+" + * | + * | "=" * Both and are decimal values. If included, the range is * enclosed in brackets. As an abbreviation, if is 0 then the range - * can be given as just (no "+" needed). + * can be given as just (no "+" needed). The "=" form asserts + * that the underlying object is exactly bytes in size. * * When both a checksum and a range are included, note that the checksum is * taken over the entire original object, before the range is taken into @@ -97,6 +100,7 @@ public: std::string get_segment() const { return segment; } std::string get_sequence() const { return object; } std::string get_basename() const { return segment + "/" + object; } + ObjectReference base() const { return ObjectReference(segment, object); } bool has_checksum() const { return checksum_valid; } std::string get_checksum() const { return checksum; } @@ -107,17 +111,27 @@ public: bool has_range() const { return range_valid; } size_t get_range_start() const { return range_start; } size_t get_range_length() const { return range_length; } - void clear_range() { range_start = range_length = 0; range_valid = false; } - void set_range(size_t start, size_t length) - { range_start = start; range_length = length; range_valid = true; } + size_t get_range_exact() const { return range_exact; } + void clear_range() + { range_start = range_length = 0; + range_valid = false; range_exact = false; } + void set_range(size_t start, size_t length, bool exact = false) + { range_start = start; range_length = length; + range_valid = true; range_exact = exact; } bool merge(ObjectReference ref); + // Maybe provide non-string implementations? + bool operator==(const ObjectReference &x) const + { return to_string() == x.to_string(); } + bool operator<(const ObjectReference &x) const + { return to_string() < x.to_string(); } + private: RefType type; std::string segment, object, checksum; size_t range_start, range_length; - bool checksum_valid, range_valid; + bool checksum_valid, range_valid, range_exact; }; #endif // _LBS_REF_H