refactoring: introduce Send/Receive split types 24/199124/7
authorAdrian Szyndela <adrian.s@samsung.com>
Mon, 4 Feb 2019 11:56:49 +0000 (12:56 +0100)
committerAdrian Szyndela <adrian.s@samsung.com>
Mon, 11 Feb 2019 11:08:47 +0000 (12:08 +0100)
This will help with getting rid of some unnecessary switches/ifs and types.

Change-Id: I784e133063c78f2b14ee50c81d526253ec173f0c

src/internal/naive_policy_db.cpp
src/internal/naive_policy_db.hpp
src/internal/policy.cpp
src/internal/policy.hpp

index 6b2946b..a4f54a7 100755 (executable)
@@ -186,24 +186,28 @@ void NaivePolicyDb::PolicySet<P>::addItem(const PolicyType policy_type,
        }
 }
 
-/****************** 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");
 
@@ -215,6 +219,7 @@ DecisionItem NaivePolicyDb::PolicySR::getDecisionItem(const MatchItemSR &item) c
        }
        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,
index 862985b..b8489cc 100755 (executable)
@@ -33,11 +33,12 @@ namespace ldp_xml_parser
        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(); }
@@ -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<ItemSend, MatchItemSend> {
+               public:
+               };
+               class PolicyReceive : public PolicySRBase<ItemReceive, MatchItemReceive> {
+               public:
+               };
+
+               typedef PolicySRBase<ItemSendReceive, MatchItemSR> PolicySR;
 
                /** Class containing policy with ownership rules */
                class PolicyOwn {
index 5379452..c3f43ad 100755 (executable)
@@ -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<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 <<
index a6c5c8a..32037e7 100755 (executable)
@@ -27,6 +27,7 @@
 #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
@@ -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 <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;