GBP: add allowed ethertypes to contracts
[vpp.git] / extras / vom / vom / object_base.hpp
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #ifndef __VOM_OBJECT_H__
17 #define __VOM_OBJECT_H__
18
19 #include <memory>
20 #include <string>
21
22 #include "vom/types.hpp"
23
24 namespace VOM {
25 /**
26  * A base class for all object_base in the VPP object_base-Model.
27  *  provides the abstract interface.
28  */
29 class object_base
30 {
31 public:
32   /**
33    * convert to string format for debug purposes
34    */
35   virtual std::string to_string() const = 0;
36
37   /**
38    * Sweep/reap the object if still stale
39    */
40   virtual void sweep(void) = 0;
41
42   /**
43    * replay the object to create it in hardware
44    */
45   virtual void replay(void) = 0;
46
47 protected:
48   /**
49    * Constructable by derived classes only
50    */
51   object_base() = default;
52   /**
53    * Destructor
54    */
55   virtual ~object_base() = default;
56
57 private:
58   /**
59    * note we are not maintaining dependencies back to the
60    * keys. i.e. this object does not know all the keys that
61    * refer to it.
62    */
63 };
64
65 /**
66  * object state
67  */
68 enum obj_state_t
69 {
70   OBJECT_STATE_NONE = 0,
71   /**
72    * indicates the object is stale. This flag is set
73    * when a new epoch is declared. the flag is cleared
74    * when the object is updated in the new epoch. If the
75    * flag is still set after convergence is declared then
76    * the object is deleted
77    */
78   OBJECT_STATE_STALE,
79 };
80
81 /**
82  * A represenation of a reference to a VPP object.
83  *  the reference counting is held through the use of shared pointers.
84  * We also maintain the state of the object ready for mark n' sweep.
85  */
86 class object_ref
87 {
88 public:
89   /**
90    * Constructor
91    */
92   object_ref(std::shared_ptr<object_base> obj);
93
94   /**
95    * less than operator
96    */
97   bool operator<(const object_ref& other) const;
98
99   /**
100    * Return the shared pointer
101    */
102   std::shared_ptr<object_base> obj() const;
103
104   /**
105    * Mark the reference object as stale
106    */
107   void mark() const;
108
109   /**
110    * Clear the stale flag on the object
111    */
112   void clear() const;
113
114   /**
115    * Query if the object is stale
116    */
117   bool stale() const;
118
119 private:
120   /**
121    * The reference object
122    */
123   std::shared_ptr<object_base> m_obj;
124
125   /**
126    * Not part of the key (in the set) so we can change it
127    * whilst iterating
128    */
129   mutable obj_state_t m_state;
130 };
131
132 /**
133  * ostream print of a VPP Obect
134  */
135 std::ostream& operator<<(std::ostream& os, const object_base& o);
136 };
137
138 /*
139  * fd.io coding-style-patch-verification: ON
140  *
141  * Local Variables:
142  * eval: (c-set-style "mozilla")
143  * End:
144  */
145
146 #endif