diff options
Diffstat (limited to 'src/mongo/base/data_type_terminated.h')
-rw-r--r-- | src/mongo/base/data_type_terminated.h | 137 |
1 files changed, 71 insertions, 66 deletions
diff --git a/src/mongo/base/data_type_terminated.h b/src/mongo/base/data_type_terminated.h index 0c2e8847bfc..57fe61dbf9a 100644 --- a/src/mongo/base/data_type_terminated.h +++ b/src/mongo/base/data_type_terminated.h @@ -33,86 +33,91 @@ namespace mongo { - template <char C, typename T> - struct Terminated { - Terminated() : value(DataType::defaultConstruct<T>()) {} - Terminated(T value) : value(std::move(value)) {} - T value; - - operator T() const { - return value; +template <char C, typename T> +struct Terminated { + Terminated() : value(DataType::defaultConstruct<T>()) {} + Terminated(T value) : value(std::move(value)) {} + T value; + + operator T() const { + return value; + } +}; + +struct TerminatedHelper { + static Status makeLoadNoTerminalStatus(char c, size_t length, std::ptrdiff_t debug_offset); + static Status makeLoadShortReadStatus(char c, + size_t read, + size_t length, + std::ptrdiff_t debug_offset); + static Status makeStoreStatus(char c, size_t length, std::ptrdiff_t debug_offset); +}; + +template <char C, typename T> +struct DataType::Handler<Terminated<C, T>> { + using TerminatedType = Terminated<C, T>; + + static Status load(TerminatedType* tt, + const char* ptr, + size_t length, + size_t* advanced, + std::ptrdiff_t debug_offset) { + size_t local_advanced = 0; + + const char* end = static_cast<const char*>(std::memchr(ptr, C, length)); + + if (!end) { + return TerminatedHelper::makeLoadNoTerminalStatus(C, length, debug_offset); } - }; - struct TerminatedHelper { - static Status makeLoadNoTerminalStatus(char c, size_t length, std::ptrdiff_t debug_offset); - static Status makeLoadShortReadStatus(char c, size_t read, size_t length, - std::ptrdiff_t debug_offset); - static Status makeStoreStatus(char c, size_t length, std::ptrdiff_t debug_offset); - }; + auto status = DataType::load( + tt ? &tt->value : nullptr, ptr, end - ptr, &local_advanced, debug_offset); - template <char C, typename T> - struct DataType::Handler<Terminated<C, T>> { - using TerminatedType = Terminated<C, T>; - - static Status load(TerminatedType* tt, const char* ptr, size_t length, size_t* advanced, - std::ptrdiff_t debug_offset) - { - size_t local_advanced = 0; - - const char* end = static_cast<const char*>(std::memchr(ptr, C, length)); - - if (!end) { - return TerminatedHelper::makeLoadNoTerminalStatus(C, length, debug_offset); - } - - auto status = DataType::load(tt ? &tt->value : nullptr, ptr, end - ptr, &local_advanced, - debug_offset); - - if (!status.isOK()) { - return status; - } - - if (local_advanced != static_cast<size_t>(end - ptr)) { - return TerminatedHelper::makeLoadShortReadStatus(C, local_advanced, end - ptr, - debug_offset); - } + if (!status.isOK()) { + return status; + } - if (advanced) { - *advanced = local_advanced + 1; - } + if (local_advanced != static_cast<size_t>(end - ptr)) { + return TerminatedHelper::makeLoadShortReadStatus( + C, local_advanced, end - ptr, debug_offset); + } - return Status::OK(); + if (advanced) { + *advanced = local_advanced + 1; } - static Status store(const TerminatedType& tt, char* ptr, size_t length, size_t* advanced, - std::ptrdiff_t debug_offset) - { - size_t local_advanced = 0; + return Status::OK(); + } - auto status = DataType::store(tt.value, ptr, length, &local_advanced, debug_offset); + static Status store(const TerminatedType& tt, + char* ptr, + size_t length, + size_t* advanced, + std::ptrdiff_t debug_offset) { + size_t local_advanced = 0; - if (!status.isOK()) { - return status; - } + auto status = DataType::store(tt.value, ptr, length, &local_advanced, debug_offset); - if (length - local_advanced < 1) { - return TerminatedHelper::makeStoreStatus(C, length, debug_offset + local_advanced); - } + if (!status.isOK()) { + return status; + } - ptr[local_advanced] = C; + if (length - local_advanced < 1) { + return TerminatedHelper::makeStoreStatus(C, length, debug_offset + local_advanced); + } - if (advanced) { - *advanced = local_advanced + 1; - } + ptr[local_advanced] = C; - return Status::OK(); + if (advanced) { + *advanced = local_advanced + 1; } - static TerminatedType defaultConstruct() { - return TerminatedType(); - } + return Status::OK(); + } - }; + static TerminatedType defaultConstruct() { + return TerminatedType(); + } +}; -} // namespace mongo +} // namespace mongo |