summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2007-10-18 14:06:09 +0000
committerAndrew Stitcher <astitcher@apache.org>2007-10-18 14:06:09 +0000
commit07969f395f233bf940029304f06fa0fd7bfcd193 (patch)
treef1cb2e7c090665545d177d2cb3a6c4053c3b7003 /cpp/src
parente77ead1fcc4ab32323a1a1212e42498ed6c4b60e (diff)
downloadqpid-python-07969f395f233bf940029304f06fa0fd7bfcd193.tar.gz
Recast int to FixedWidthValue conversions to avoid tamplate specialisation and be more general
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@585966 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/qpid/framing/FieldValue.cpp111
-rw-r--r--cpp/src/qpid/framing/FieldValue.h37
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;