This will help with getting rid of some unnecessary switches/ifs and types.
Change-Id: I784e133063c78f2b14ee50c81d526253ec173f0c
}
}
-/****************** NaivePolicyDb::PolicySR ************************/
-void NaivePolicyDb::PolicySR::addItem(ItemSendReceive* item) {
+/****************** NaivePolicyDb::PolicySRBase ************************/
+template <typename TI, typename TM>
+void NaivePolicyDb::PolicySRBase<TI, TM>::addItem(TI* item) {
m_items.push_back(item);
}
-size_t NaivePolicyDb::PolicySR::getSize() const {
- size_t size = m_items.capacity() * sizeof(decltype(m_items)::value_type);
+template <typename TI, typename TM>
+size_t NaivePolicyDb::PolicySRBase<TI, TM>::getSize() const {
+ size_t size = m_items.capacity() * sizeof(typename decltype(m_items)::value_type);
for (const auto& i : m_items)
size += i->getSize();
return size;
}
-void NaivePolicyDb::PolicySR::printContent() const {
+template <typename TI, typename TM>
+void NaivePolicyDb::PolicySRBase<TI, TM>::printContent() const {
for (const auto& i : m_items)
std::cerr << i << std::endl;
}
-DecisionItem NaivePolicyDb::PolicySR::getDecisionItem(const MatchItemSR &item) const {
+template <typename TI, typename TM>
+DecisionItem NaivePolicyDb::PolicySRBase<TI, TM>::getDecisionItem(const TM &item) const {
for (auto i : *this) {
tslog::log_verbose("-read: ", i->getDecision(), " ", i, "\n");
}
return Decision::ANY;
}
+template DecisionItem NaivePolicyDb::PolicySRBase<ItemSendReceive, MatchItemSR>::getDecisionItem(const MatchItemSR &item) const;
bool NaivePolicyDb::getPolicy(const ItemType item_type,
const PolicyType policy_type,
class NaivePolicyDb {
public:
/** Class containing policy with send/receive rules */
- class PolicySR {
+ template <typename TI, typename TM>
+ class PolicySRBase {
private:
/** Vector with policy items */
- std::vector<ItemSendReceive const *> m_items;
- typedef decltype(m_items)::const_reverse_iterator PolicyConstIterator;
+ std::vector<TI const *> m_items;
+ typedef typename decltype(m_items)::const_reverse_iterator PolicyConstIterator;
PolicyConstIterator begin() const { return m_items.rbegin(); }
PolicyConstIterator end() const { return m_items.rend(); }
/** Adds given item to policy.
* \param[in] item Item to add to policy
*/
- void addItem(ItemSendReceive* item);
+ void addItem(TI* item);
- DecisionItem getDecisionItem(const MatchItemSR &item) const;
+ DecisionItem getDecisionItem(const TM &item) const;
void printContent() const;
size_t getSize() const;
};
+ class PolicySend : public PolicySRBase<ItemSend, MatchItemSend> {
+ public:
+ };
+ class PolicyReceive : public PolicySRBase<ItemReceive, MatchItemReceive> {
+ public:
+ };
+
+ typedef PolicySRBase<ItemSendReceive, MatchItemSR> PolicySR;
/** Class containing policy with ownership rules */
class PolicyOwn {
__message_dir_to_str(item.direction) << ")";
}
+std::ostream &operator<<(std::ostream& stream, const MatchItemSend &item)
+{
+ stream << "MatchItemSend";
+ return stream << static_cast<const MatchItemSR>(item);
+}
+
+std::ostream &operator<<(std::ostream& stream, const MatchItemReceive &item)
+{
+ stream << "MatchItemReceive";
+ return stream << static_cast<const MatchItemSR>(item);
+}
+
std::ostream &operator<<(std::ostream& stream, const ItemSendReceive &item)
{
return stream << ": name(" << item.__name << "), inter(" << item.__interface <<
#include <internal/internal.h>
#include <string>
#include <vector>
+#include <typeinfo>
/** Maximum tree node children. It is connected with proper characters which can be used in name.*/
#define MAX_CHILDREN 65
boost::string_ref path;
MessageType type;
MessageDirection direction;
- MatchItemSR(const char* i = NULL, const char* me = NULL, const char* p = NULL, MessageType t = MessageType::ANY, MessageDirection d = MessageDirection::ANY);
+ MatchItemSR(const char* i, const char* me, const char* p, MessageType t, MessageDirection d);
void addName(const char* name);
bool addNames(const char* name);
};
std::ostream &operator<<(std::ostream& stream, const MatchItemSR &item);
+ class MatchItemSend : public MatchItemSR {
+ using MatchItemSR::MatchItemSR;
+ friend std::ostream &operator<<(std::ostream& stream, const MatchItemSend &item);
+ };
+ std::ostream &operator<<(std::ostream& stream, const MatchItemSend &item);
+
+ class MatchItemReceive : public MatchItemSR {
+ using MatchItemSR::MatchItemSR;
+ friend std::ostream &operator<<(std::ostream& stream, const MatchItemReceive &item);
+ };
+ std::ostream &operator<<(std::ostream& stream, const MatchItemReceive &item);
+
/** Class contains info about item send/receive */
class ItemSendReceive {
- private:
+ protected:
DecisionItem __decision;
std::string __name;
std::string __interface;
};
std::ostream &operator<<(std::ostream& stream, const ItemSendReceive &item);
+ template <typename M>
+ class ItemSR : public ItemSendReceive {
+ public:
+ bool match(const M &item) const {
+ return ItemSendReceive::match(item);
+ }
+
+ friend std::ostream &operator<<(std::ostream& stream, const ItemSR<M> &item) {
+ stream << typeid(item).name();
+ return stream << static_cast<const ItemSendReceive>(item);
+ }
+ };
+
+ typedef ItemSR<MatchItemSend> ItemSend;
+ typedef ItemSR<MatchItemReceive> ItemReceive;
+
class MatchItemAccess {
private:
const uid_t __uid;