diff options
Diffstat (limited to 'cpp/src/qpid/broker/TopicExchange.h')
-rw-r--r-- | cpp/src/qpid/broker/TopicExchange.h | 82 |
1 files changed, 31 insertions, 51 deletions
diff --git a/cpp/src/qpid/broker/TopicExchange.h b/cpp/src/qpid/broker/TopicExchange.h index 2e107142b7..3bbf143889 100644 --- a/cpp/src/qpid/broker/TopicExchange.h +++ b/cpp/src/qpid/broker/TopicExchange.h @@ -23,77 +23,57 @@ #include <map> #include <vector> -#include "Exchange.h" +#include "qpid/broker/BrokerImportExport.h" +#include "qpid/broker/Exchange.h" #include "qpid/framing/FieldTable.h" #include "qpid/sys/Monitor.h" -#include "Queue.h" +#include "qpid/broker/Queue.h" namespace qpid { namespace broker { -/** A vector of string tokens */ -class Tokens : public std::vector<std::string> { - public: - Tokens() {}; - // Default copy, assign, dtor are sufficient. - - /** Tokenize s, provides automatic conversion of string to Tokens */ - Tokens(const std::string& s) { operator=(s); } - /** Tokenizing assignment operator s */ - Tokens & operator=(const std::string& s); - - private: - size_t hash; -}; - - -/** - * Tokens that have been normalized as a pattern and can be matched - * with topic Tokens. Normalized meands all sequences of mixed * and - * # are reduced to a series of * followed by at most one #. - */ -class TopicPattern : public Tokens -{ - public: - TopicPattern() {} - // Default copy, assign, dtor are sufficient. - TopicPattern(const Tokens& tokens) { operator=(tokens); } - TopicPattern(const std::string& str) { operator=(str); } - TopicPattern& operator=(const Tokens&); - TopicPattern& operator=(const std::string& str) { return operator=(Tokens(str)); } - - /** Match a topic */ - bool match(const std::string& topic) { return match(Tokens(topic)); } - bool match(const Tokens& topic) const; - - private: - void normalize(); -}; - -class TopicExchange : public virtual Exchange{ - typedef std::map<TopicPattern, Binding::vector> BindingMap; +class TopicExchange : public virtual Exchange { + struct BoundKey { + Binding::vector bindingVector; + FedBinding fedBinding; + }; + typedef std::map<std::string, BoundKey> BindingMap; BindingMap bindings; qpid::sys::RWlock lock; - bool isBound(Queue::shared_ptr queue, TopicPattern& pattern); + bool isBound(Queue::shared_ptr queue, const string& pattern); + public: static const std::string typeName; - TopicExchange(const string& name, management::Manageable* parent = 0); - TopicExchange(const string& _name, bool _durable, - const qpid::framing::FieldTable& _args, management::Manageable* parent = 0); + static QPID_BROKER_EXTERN bool match(const std::string& pattern, const std::string& topic); + static QPID_BROKER_EXTERN std::string normalize(const std::string& pattern); + + QPID_BROKER_EXTERN TopicExchange(const string& name, + management::Manageable* parent = 0, Broker* broker = 0); + QPID_BROKER_EXTERN TopicExchange(const string& _name, + bool _durable, + const qpid::framing::FieldTable& _args, + management::Manageable* parent = 0, Broker* broker = 0); virtual std::string getType() const { return typeName; } - virtual bool bind(Queue::shared_ptr queue, const string& routingKey, const qpid::framing::FieldTable* args); + QPID_BROKER_EXTERN virtual bool bind(Queue::shared_ptr queue, + const string& routingKey, + const qpid::framing::FieldTable* args); virtual bool unbind(Queue::shared_ptr queue, const string& routingKey, const qpid::framing::FieldTable* args); - virtual void route(Deliverable& msg, const string& routingKey, const qpid::framing::FieldTable* args); + QPID_BROKER_EXTERN virtual void route(Deliverable& msg, + const string& routingKey, + const qpid::framing::FieldTable* args); - virtual bool isBound(Queue::shared_ptr queue, const string* const routingKey, const qpid::framing::FieldTable* const args); + QPID_BROKER_EXTERN virtual bool isBound(Queue::shared_ptr queue, + const string* const routingKey, + const qpid::framing::FieldTable* const args); - virtual ~TopicExchange(); + QPID_BROKER_EXTERN virtual ~TopicExchange(); + virtual bool supportsDynamicBinding() { return true; } }; |