diff options
Diffstat (limited to 'tensorflow/core/lib/core/raw_coding.h')
-rw-r--r-- | tensorflow/core/lib/core/raw_coding.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/tensorflow/core/lib/core/raw_coding.h b/tensorflow/core/lib/core/raw_coding.h new file mode 100644 index 0000000000..1fe49b75bb --- /dev/null +++ b/tensorflow/core/lib/core/raw_coding.h @@ -0,0 +1,43 @@ +#ifndef TENSORFLOW_LIB_CORE_RAW_CODING_H_ +#define TENSORFLOW_LIB_CORE_RAW_CODING_H_ + +#include <string.h> +#include "tensorflow/core/platform/port.h" + +namespace tensorflow { +namespace core { + +// Lower-level versions of Get... that read directly from a character buffer +// without any bounds checking. + +inline uint32 DecodeFixed32(const char* ptr) { + if (port::kLittleEndian) { + // Load the raw bytes + uint32 result; + memcpy(&result, ptr, sizeof(result)); // gcc optimizes this to a plain load + return result; + } else { + return ((static_cast<uint32>(static_cast<unsigned char>(ptr[0]))) | + (static_cast<uint32>(static_cast<unsigned char>(ptr[1])) << 8) | + (static_cast<uint32>(static_cast<unsigned char>(ptr[2])) << 16) | + (static_cast<uint32>(static_cast<unsigned char>(ptr[3])) << 24)); + } +} + +inline uint64 DecodeFixed64(const char* ptr) { + if (port::kLittleEndian) { + // Load the raw bytes + uint64 result; + memcpy(&result, ptr, sizeof(result)); // gcc optimizes this to a plain load + return result; + } else { + uint64 lo = DecodeFixed32(ptr); + uint64 hi = DecodeFixed32(ptr + 4); + return (hi << 32) | lo; + } +} + +} // namespace core +} // namespace tensorflow + +#endif // TENSORFLOW_LIB_CORE_RAW_CODING_H_ |