diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/framing/FieldValue.cpp | 111 | ||||
-rw-r--r-- | cpp/src/qpid/framing/FieldValue.h | 37 |
2 files changed, 18 insertions, 130 deletions
diff --git a/cpp/src/qpid/framing/FieldValue.cpp b/cpp/src/qpid/framing/FieldValue.cpp index a43c0710ae..71961fa98a 100644 --- a/cpp/src/qpid/framing/FieldValue.cpp +++ b/cpp/src/qpid/framing/FieldValue.cpp @@ -26,117 +26,6 @@ namespace qpid { namespace framing { -/* - * Specialisations for construction from integers - */ -template<> -FixedWidthValue<8>::FixedWidthValue(uint64_t v) -{ - octets[7] = (uint8_t) (0xFF & v); v >>= 8; - octets[6] = (uint8_t) (0xFF & v); v >>= 8; - octets[5] = (uint8_t) (0xFF & v); v >>= 8; - octets[4] = (uint8_t) (0xFF & v); v >>= 8; - octets[3] = (uint8_t) (0xFF & v); v >>= 8; - octets[2] = (uint8_t) (0xFF & v); v >>= 8; - octets[1] = (uint8_t) (0xFF & v); v >>= 8; - octets[0] = (uint8_t) (0xFF & v); -} - -template<> -FixedWidthValue<4>::FixedWidthValue(uint64_t v) -{ - octets[3] = (uint8_t) (0xFF & v); v >>= 8; - octets[2] = (uint8_t) (0xFF & v); v >>= 8; - octets[1] = (uint8_t) (0xFF & v); v >>= 8; - octets[0] = (uint8_t) (0xFF & v); -} - -template<> -FixedWidthValue<2>::FixedWidthValue(uint64_t v) -{ - octets[1] = (uint8_t) (0xFF & v); v >>= 8; - octets[0] = (uint8_t) (0xFF & v); -} - -template<> -FixedWidthValue<1>::FixedWidthValue(uint64_t v) -{ - octets[0] = (uint8_t) (0xFF & v); -} - -/* - * Specialisations for turning into integers - */ -template<> -int64_t FixedWidthValue<8>::getInt() const -{ - int64_t v = 0; - v |= octets[0]; v <<= 8; - v |= octets[1]; v <<= 8; - v |= octets[2]; v <<= 8; - v |= octets[3]; v <<= 8; - v |= octets[4]; v <<= 8; - v |= octets[5]; v <<= 8; - v |= octets[6]; v <<= 8; - v |= octets[7]; - return v; -} - -template<> -int64_t FixedWidthValue<4>::getInt() const -{ - int64_t v = 0; - v |= octets[0]; v <<= 8; - v |= octets[1]; v <<= 8; - v |= octets[2]; v <<= 8; - v |= octets[3]; - return v; -} - -template<> -int64_t FixedWidthValue<2>::getInt() const -{ - int64_t v = 0; - v |= octets[0]; v <<= 8; - v |= octets[1]; - return v; -} - -template<> -int64_t FixedWidthValue<1>::getInt() const -{ - int64_t v = 0; - v |= octets[0]; - return v; -} - -/* - * Specialisations for convertion to int predicate - */ -template<> -bool FixedWidthValue<8>::convertsToInt() const -{ - return true; -} - -template<> -bool FixedWidthValue<4>::convertsToInt() const -{ - return true; -} - -template<> -bool FixedWidthValue<2>::convertsToInt() const -{ - return true; -} - -template<> -bool FixedWidthValue<1>::convertsToInt() const -{ - return true; -} - void FieldValue::decode(Buffer& buffer) { typeOctet = buffer.getOctet(); diff --git a/cpp/src/qpid/framing/FieldValue.h b/cpp/src/qpid/framing/FieldValue.h index 01ba229f9b..171afb68d0 100644 --- a/cpp/src/qpid/framing/FieldValue.h +++ b/cpp/src/qpid/framing/FieldValue.h @@ -90,7 +90,14 @@ class FixedWidthValue : public FieldValue::Data { public: FixedWidthValue() {} FixedWidthValue(const uint8_t (&data)[width]) : octets(data) {} - FixedWidthValue(uint64_t v); + FixedWidthValue(uint64_t v) + { + for (int i = width; i > 0; --i) { + octets[i-1] = (uint8_t) (0xFF & v); v >>= 8; + } + octets[0] = (uint8_t) (0xFF & v); + } + uint32_t size() const { return width; } void encode(Buffer& buffer) { buffer.putRawData(octets, width); } void decode(Buffer& buffer) { buffer.getRawData(octets, width); } @@ -100,8 +107,16 @@ class FixedWidthValue : public FieldValue::Data { else return std::equal(&octets[0], &octets[width], &rhs->octets[0]); } - bool convertsToInt() const { return false; } - int64_t getInt() const { return 0; } + bool convertsToInt() const { return true; } + int64_t getInt() const + { + int64_t v = 0; + for (int i = 0; i < width-1; ++i) { + v |= octets[i]; v <<= 8; + } + v |= octets[width-1]; + return v; + } void print(std::ostream& o) const { o << "F" << width << ":"; }; }; @@ -120,22 +135,6 @@ class FixedWidthValue<0> : public FieldValue::Data { void print(std::ostream& o) const { o << "F0"; }; }; -template<> FixedWidthValue<8>::FixedWidthValue(uint64_t v); -template<> int64_t FixedWidthValue<8>::getInt() const; -template<> bool FixedWidthValue<8>::convertsToInt() const; - -template<> int64_t FixedWidthValue<4>::getInt() const; -template<> FixedWidthValue<4>::FixedWidthValue(uint64_t v); -template<> bool FixedWidthValue<4>::convertsToInt() const; - -template<> FixedWidthValue<2>::FixedWidthValue(uint64_t v); -template<> int64_t FixedWidthValue<2>::getInt() const; -template<> bool FixedWidthValue<2>::convertsToInt() const; - -template<> FixedWidthValue<1>::FixedWidthValue(uint64_t v); -template<> int64_t FixedWidthValue<1>::getInt() const; -template<> bool FixedWidthValue<1>::convertsToInt() const; - template <int lenwidth> class VariableWidthValue : public FieldValue::Data { std::vector<uint8_t> octets; |