diff options
-rw-r--r-- | cpp/src/qpid/broker/Message.cpp | 20 | ||||
-rw-r--r-- | cpp/src/qpid/framing/FrameSet.cpp | 16 | ||||
-rw-r--r-- | cpp/src/qpid/framing/TypeFilter.h | 33 | ||||
-rw-r--r-- | cpp/src/qpid/framing/frame_functors.h | 8 |
4 files changed, 35 insertions, 42 deletions
diff --git a/cpp/src/qpid/broker/Message.cpp b/cpp/src/qpid/broker/Message.cpp index fe412fd77b..c307118f20 100644 --- a/cpp/src/qpid/broker/Message.cpp +++ b/cpp/src/qpid/broker/Message.cpp @@ -74,7 +74,7 @@ uint32_t Message::getRequiredCredit() const { //add up payload for all header and content frames in the frameset SumBodySize sum; - frames.map_if(sum, TypeFilter(HEADER_BODY, CONTENT_BODY)); + frames.map_if(sum, TypeFilter2<HEADER_BODY, CONTENT_BODY>()); return sum.getSize(); } @@ -82,18 +82,18 @@ void Message::encode(framing::Buffer& buffer) const { //encode method and header frames EncodeFrame f1(buffer); - frames.map_if(f1, TypeFilter(METHOD_BODY, HEADER_BODY)); + frames.map_if(f1, TypeFilter2<METHOD_BODY, HEADER_BODY>()); //then encode the payload of each content frame EncodeBody f2(buffer); - frames.map_if(f2, TypeFilter(CONTENT_BODY)); + frames.map_if(f2, TypeFilter<CONTENT_BODY>()); } void Message::encodeContent(framing::Buffer& buffer) const { //encode the payload of each content frame EncodeBody f2(buffer); - frames.map_if(f2, TypeFilter(CONTENT_BODY)); + frames.map_if(f2, TypeFilter<CONTENT_BODY>()); } uint32_t Message::encodedSize() const @@ -110,7 +110,7 @@ uint32_t Message::encodedHeaderSize() const { //add up the size for all method and header frames in the frameset SumFrameSize sum; - frames.map_if(sum, TypeFilter(METHOD_BODY, HEADER_BODY)); + frames.map_if(sum, TypeFilter2<METHOD_BODY, HEADER_BODY>()); return sum.getSize(); } @@ -137,7 +137,7 @@ void Message::decodeContent(framing::Buffer& buffer) } else { //adjust header flags MarkLastSegment f; - frames.map_if(f, TypeFilter(HEADER_BODY)); + frames.map_if(f, TypeFilter<HEADER_BODY>()); } //mark content loaded loaded = true; @@ -152,7 +152,7 @@ void Message::releaseContent(MessageStore* _store) store->stage(*this); } //remove any content frames from the frameset - frames.remove(TypeFilter(CONTENT_BODY)); + frames.remove(TypeFilter<CONTENT_BODY>()); setContentReleased(); } @@ -183,17 +183,17 @@ void Message::sendContent(Queue& queue, framing::FrameHandler& out, uint16_t max } else { Count c; - frames.map_if(c, TypeFilter(CONTENT_BODY)); + frames.map_if(c, TypeFilter<CONTENT_BODY>()); SendContent f(out, maxFrameSize, c.getCount()); - frames.map_if(f, TypeFilter(CONTENT_BODY)); + frames.map_if(f, TypeFilter<CONTENT_BODY>()); } } void Message::sendHeader(framing::FrameHandler& out, uint16_t /*maxFrameSize*/) const { Relay f(out); - frames.map_if(f, TypeFilter(HEADER_BODY)); + frames.map_if(f, TypeFilter<HEADER_BODY>()); } // FIXME aconway 2007-11-09: Obsolete, remove. Was used to cover over diff --git a/cpp/src/qpid/framing/FrameSet.cpp b/cpp/src/qpid/framing/FrameSet.cpp index b361076ee7..9d9b7bc8f8 100644 --- a/cpp/src/qpid/framing/FrameSet.cpp +++ b/cpp/src/qpid/framing/FrameSet.cpp @@ -64,18 +64,20 @@ AMQHeaderBody* FrameSet::getHeaders() uint64_t FrameSet::getContentSize() const { SumBodySize sum; - map_if(sum, TypeFilter(CONTENT_BODY)); + map_if(sum, TypeFilter<CONTENT_BODY>()); return sum.getSize(); } -void FrameSet::getContent(std::string& out) const -{ - AccumulateContent accumulator(out); - map_if(accumulator, TypeFilter(CONTENT_BODY)); +void FrameSet::getContent(std::string& out) const { + out.clear(); + out.reserve(getContentSize()); + for(Frames::const_iterator i = parts.begin(); i != parts.end(); i++) { + if (i->getBody()->type() == CONTENT_BODY) + out += i->castBody<AMQContentBody>()->getData(); + } } -std::string FrameSet::getContent() const -{ +std::string FrameSet::getContent() const { std::string out; getContent(out); return out; diff --git a/cpp/src/qpid/framing/TypeFilter.h b/cpp/src/qpid/framing/TypeFilter.h index 3a607190fd..d1c42de583 100644 --- a/cpp/src/qpid/framing/TypeFilter.h +++ b/cpp/src/qpid/framing/TypeFilter.h @@ -1,3 +1,6 @@ +#ifndef QPID_FRAMING_TYPEFILTER_H +#define QPID_FRAMING_TYPEFILTER_H + /* * * Licensed to the Apache Software Foundation (ASF) under one @@ -23,30 +26,26 @@ #include "qpid/framing/AMQFrame.h" #include "qpid/framing/FrameHandler.h" -#ifndef _TypeFilter_ -#define _TypeFilter_ - namespace qpid { namespace framing { /** * Predicate that selects frames by type */ -class TypeFilter -{ - std::vector<uint8_t> types; -public: - TypeFilter(uint8_t type) { add(type); } - TypeFilter(uint8_t type1, uint8_t type2) { add(type1); add(type2); } - void add(uint8_t type) { types.push_back(type); } - bool operator()(const AMQFrame& f) const - { - return find(types.begin(), types.end(), f.getBody()->type()) != types.end(); - } +template <uint8_t Type> +struct TypeFilter { + bool operator()(const AMQFrame& f) const { + return f.getBody()->type() == Type; + } }; -} -} +template <uint8_t T1, uint8_t T2> +struct TypeFilter2 { + bool operator()(const AMQFrame& f) const { + return f.getBody()->type() == T1 || f.getBody()->type() == T2; + } +}; +}} // namespace qpid::framing -#endif +#endif /*!QPID_FRAMING_TYPEFILTER_H*/ diff --git a/cpp/src/qpid/framing/frame_functors.h b/cpp/src/qpid/framing/frame_functors.h index 992d389faf..d915a270c2 100644 --- a/cpp/src/qpid/framing/frame_functors.h +++ b/cpp/src/qpid/framing/frame_functors.h @@ -74,14 +74,6 @@ public: void operator()(const AMQFrame& f) { f.getBody()->encode(buffer); } }; -class AccumulateContent -{ - std::string& content; -public: - AccumulateContent(std::string& c) : content(c) {} - void operator()(const AMQFrame& f) { content += f.castBody<AMQContentBody>()->getData(); } -}; - /** * Sends a copy of the frame its applied to to the specified handler */ |