diff options
Diffstat (limited to 'src/mongo/db/record_id.h')
-rw-r--r-- | src/mongo/db/record_id.h | 186 |
1 files changed, 105 insertions, 81 deletions
diff --git a/src/mongo/db/record_id.h b/src/mongo/db/record_id.h index 58514b652ee..cd7e8025b90 100644 --- a/src/mongo/db/record_id.h +++ b/src/mongo/db/record_id.h @@ -40,103 +40,127 @@ namespace mongo { +/** + * The key that uniquely identifies a Record in a Collection or RecordStore. + */ +class RecordId { +public: /** - * The key that uniquely identifies a Record in a Collection or RecordStore. + * Constructs a Null RecordId. */ - class RecordId { - public: - - /** - * Constructs a Null RecordId. - */ - RecordId() : _repr(kNullRepr) {} + RecordId() : _repr(kNullRepr) {} - explicit RecordId(int64_t repr) : _repr(repr) {} + explicit RecordId(int64_t repr) : _repr(repr) {} - /** - * Construct a RecordId from two halves. - * TODO consider removing. - */ - RecordId(int high, int low) : _repr((uint64_t(high) << 32) | uint32_t(low)) {} + /** + * Construct a RecordId from two halves. + * TODO consider removing. + */ + RecordId(int high, int low) : _repr((uint64_t(high) << 32) | uint32_t(low)) {} - /** - * A RecordId that compares less than all ids that represent documents in a collection. - */ - static RecordId min() { return RecordId(kMinRepr); } + /** + * A RecordId that compares less than all ids that represent documents in a collection. + */ + static RecordId min() { + return RecordId(kMinRepr); + } - /** - * A RecordId that compares greater than all ids that represent documents in a collection. - */ - static RecordId max() { return RecordId(kMaxRepr); } + /** + * A RecordId that compares greater than all ids that represent documents in a collection. + */ + static RecordId max() { + return RecordId(kMaxRepr); + } - bool isNull() const { return _repr == 0; } + bool isNull() const { + return _repr == 0; + } - int64_t repr() const { return _repr; } + int64_t repr() const { + return _repr; + } - /** - * Normal RecordIds are the only ones valid for representing Records. All RecordIds outside - * of this range are sentinel values. - */ - bool isNormal() const { return _repr > 0 && _repr < kMaxRepr; } + /** + * Normal RecordIds are the only ones valid for representing Records. All RecordIds outside + * of this range are sentinel values. + */ + bool isNormal() const { + return _repr > 0 && _repr < kMaxRepr; + } - int compare(RecordId rhs) const { - return _repr == rhs._repr ? 0 : - _repr < rhs._repr ? -1 : 1; - } + int compare(RecordId rhs) const { + return _repr == rhs._repr ? 0 : _repr < rhs._repr ? -1 : 1; + } - /** - * Hash value for this RecordId. The hash implementation may be modified, and its behavior - * may differ across platforms. Hash values should not be persisted. - */ - struct Hasher { - size_t operator()(RecordId rid) const { - size_t hash = 0; - // TODO consider better hashes - boost::hash_combine(hash, rid.repr()); - return hash; - } - }; - - /// members for Sorter - struct SorterDeserializeSettings {}; // unused - void serializeForSorter(BufBuilder& buf) const { buf.appendStruct(_repr); } - static RecordId deserializeForSorter(BufReader& buf, const SorterDeserializeSettings&) { - return RecordId(buf.read<int64_t>()); + /** + * Hash value for this RecordId. The hash implementation may be modified, and its behavior + * may differ across platforms. Hash values should not be persisted. + */ + struct Hasher { + size_t operator()(RecordId rid) const { + size_t hash = 0; + // TODO consider better hashes + boost::hash_combine(hash, rid.repr()); + return hash; } - int memUsageForSorter() const { return sizeof(RecordId); } - RecordId getOwned() const { return *this; } - - private: - static const int64_t kMaxRepr = LLONG_MAX; - static const int64_t kNullRepr = 0; - static const int64_t kMinRepr = LLONG_MIN; - - int64_t _repr; }; - inline bool operator==(RecordId lhs, RecordId rhs) { return lhs.repr() == rhs.repr(); } - inline bool operator!=(RecordId lhs, RecordId rhs) { return lhs.repr() != rhs.repr(); } - inline bool operator< (RecordId lhs, RecordId rhs) { return lhs.repr() < rhs.repr(); } - inline bool operator<=(RecordId lhs, RecordId rhs) { return lhs.repr() <= rhs.repr(); } - inline bool operator> (RecordId lhs, RecordId rhs) { return lhs.repr() > rhs.repr(); } - inline bool operator>=(RecordId lhs, RecordId rhs) { return lhs.repr() >= rhs.repr(); } - - inline StringBuilder& operator<<( StringBuilder& stream, const RecordId& id ) { - return stream << "RecordId(" << id.repr() << ')'; + /// members for Sorter + struct SorterDeserializeSettings {}; // unused + void serializeForSorter(BufBuilder& buf) const { + buf.appendStruct(_repr); } - - inline std::ostream& operator<<( std::ostream& stream, const RecordId& id ) { - return stream << "RecordId(" << id.repr() << ')'; + static RecordId deserializeForSorter(BufReader& buf, const SorterDeserializeSettings&) { + return RecordId(buf.read<int64_t>()); } - - inline std::ostream& operator<<( std::ostream& stream, const boost::optional<RecordId>& id ) { - return stream << "RecordId(" << (id ? id.get().repr() : 0) << ')'; + int memUsageForSorter() const { + return sizeof(RecordId); } - - inline logger::LogstreamBuilder& operator<<(logger::LogstreamBuilder& stream, - const RecordId& id) { - stream.stream() << id; - return stream; + RecordId getOwned() const { + return *this; } -} // namespace mongo +private: + static const int64_t kMaxRepr = LLONG_MAX; + static const int64_t kNullRepr = 0; + static const int64_t kMinRepr = LLONG_MIN; + + int64_t _repr; +}; + +inline bool operator==(RecordId lhs, RecordId rhs) { + return lhs.repr() == rhs.repr(); +} +inline bool operator!=(RecordId lhs, RecordId rhs) { + return lhs.repr() != rhs.repr(); +} +inline bool operator<(RecordId lhs, RecordId rhs) { + return lhs.repr() < rhs.repr(); +} +inline bool operator<=(RecordId lhs, RecordId rhs) { + return lhs.repr() <= rhs.repr(); +} +inline bool operator>(RecordId lhs, RecordId rhs) { + return lhs.repr() > rhs.repr(); +} +inline bool operator>=(RecordId lhs, RecordId rhs) { + return lhs.repr() >= rhs.repr(); +} + +inline StringBuilder& operator<<(StringBuilder& stream, const RecordId& id) { + return stream << "RecordId(" << id.repr() << ')'; +} + +inline std::ostream& operator<<(std::ostream& stream, const RecordId& id) { + return stream << "RecordId(" << id.repr() << ')'; +} + +inline std::ostream& operator<<(std::ostream& stream, const boost::optional<RecordId>& id) { + return stream << "RecordId(" << (id ? id.get().repr() : 0) << ')'; +} + +inline logger::LogstreamBuilder& operator<<(logger::LogstreamBuilder& stream, const RecordId& id) { + stream.stream() << id; + return stream; +} +} // namespace mongo |