From: Adrian Szyndela Date: Mon, 4 Feb 2019 11:56:49 +0000 (+0100) Subject: refactoring: introduce Send/Receive split types X-Git-Tag: accepted/tizen/unified/20190322.075526~74 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F24%2F199124%2F7;p=platform%2Fcore%2Fsystem%2Flibdbuspolicy.git refactoring: introduce Send/Receive split types This will help with getting rid of some unnecessary switches/ifs and types. Change-Id: I784e133063c78f2b14ee50c81d526253ec173f0c --- diff --git a/src/internal/naive_policy_db.cpp b/src/internal/naive_policy_db.cpp index 6b2946b..a4f54a7 100755 --- a/src/internal/naive_policy_db.cpp +++ b/src/internal/naive_policy_db.cpp @@ -186,24 +186,28 @@ void NaivePolicyDb::PolicySet

::addItem(const PolicyType policy_type, } } -/****************** NaivePolicyDb::PolicySR ************************/ -void NaivePolicyDb::PolicySR::addItem(ItemSendReceive* item) { +/****************** NaivePolicyDb::PolicySRBase ************************/ +template +void NaivePolicyDb::PolicySRBase::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 +size_t NaivePolicyDb::PolicySRBase::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 +void NaivePolicyDb::PolicySRBase::printContent() const { for (const auto& i : m_items) std::cerr << i << std::endl; } -DecisionItem NaivePolicyDb::PolicySR::getDecisionItem(const MatchItemSR &item) const { +template +DecisionItem NaivePolicyDb::PolicySRBase::getDecisionItem(const TM &item) const { for (auto i : *this) { tslog::log_verbose("-read: ", i->getDecision(), " ", i, "\n"); @@ -215,6 +219,7 @@ DecisionItem NaivePolicyDb::PolicySR::getDecisionItem(const MatchItemSR &item) c } return Decision::ANY; } +template DecisionItem NaivePolicyDb::PolicySRBase::getDecisionItem(const MatchItemSR &item) const; bool NaivePolicyDb::getPolicy(const ItemType item_type, const PolicyType policy_type, diff --git a/src/internal/naive_policy_db.hpp b/src/internal/naive_policy_db.hpp index 862985b..b8489cc 100755 --- a/src/internal/naive_policy_db.hpp +++ b/src/internal/naive_policy_db.hpp @@ -33,11 +33,12 @@ namespace ldp_xml_parser class NaivePolicyDb { public: /** Class containing policy with send/receive rules */ - class PolicySR { + template + class PolicySRBase { private: /** Vector with policy items */ - std::vector m_items; - typedef decltype(m_items)::const_reverse_iterator PolicyConstIterator; + std::vector 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(); } @@ -46,12 +47,20 @@ namespace ldp_xml_parser /** 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 { + public: + }; + class PolicyReceive : public PolicySRBase { + public: + }; + + typedef PolicySRBase PolicySR; /** Class containing policy with ownership rules */ class PolicyOwn { diff --git a/src/internal/policy.cpp b/src/internal/policy.cpp index 5379452..c3f43ad 100755 --- a/src/internal/policy.cpp +++ b/src/internal/policy.cpp @@ -603,6 +603,18 @@ std::ostream &operator<<(std::ostream& stream, const MatchItemSR &item) __message_dir_to_str(item.direction) << ")"; } +std::ostream &operator<<(std::ostream& stream, const MatchItemSend &item) +{ + stream << "MatchItemSend"; + return stream << static_cast(item); +} + +std::ostream &operator<<(std::ostream& stream, const MatchItemReceive &item) +{ + stream << "MatchItemReceive"; + return stream << static_cast(item); +} + std::ostream &operator<<(std::ostream& stream, const ItemSendReceive &item) { return stream << ": name(" << item.__name << "), inter(" << item.__interface << diff --git a/src/internal/policy.hpp b/src/internal/policy.hpp index a6c5c8a..32037e7 100755 --- a/src/internal/policy.hpp +++ b/src/internal/policy.hpp @@ -27,6 +27,7 @@ #include #include #include +#include /** Maximum tree node children. It is connected with proper characters which can be used in name.*/ #define MAX_CHILDREN 65 @@ -171,7 +172,7 @@ namespace ldp_xml_parser 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); @@ -179,9 +180,21 @@ namespace ldp_xml_parser }; 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; @@ -203,6 +216,22 @@ namespace ldp_xml_parser }; std::ostream &operator<<(std::ostream& stream, const ItemSendReceive &item); + template + class ItemSR : public ItemSendReceive { + public: + bool match(const M &item) const { + return ItemSendReceive::match(item); + } + + friend std::ostream &operator<<(std::ostream& stream, const ItemSR &item) { + stream << typeid(item).name(); + return stream << static_cast(item); + } + }; + + typedef ItemSR ItemSend; + typedef ItemSR ItemReceive; + class MatchItemAccess { private: const uid_t __uid;