/* * Copyright (c) 2017 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __VOM_OBJECT_H__ #define __VOM_OBJECT_H__ #include #include #include "vom/types.hpp" namespace VOM { /** * A base class for all object_base in the VPP object_base-Model. * provides the abstract interface. */ class object_base { public: /** * convert to string format for debug purposes */ virtual std::string to_string() const = 0; /** * Sweep/reap the object if still stale */ virtual void sweep(void) = 0; /** * replay the object to create it in hardware */ virtual void replay(void) = 0; protected: /** * Constructable by derived classes only */ object_base() = default; /** * Destructor */ virtual ~object_base() = default; private: /** * note we are not maintaining dependencies back to the * keys. i.e. this object does not know all the keys that * refer to it. */ }; /** * object state */ enum obj_state_t { OBJECT_STATE_NONE = 0, /** * indicates the object is stale. This flag is set * when a new epoch is declared. the flag is cleared * when the object is updated in the new epoch. If the * flag is still set after convergence is declared then * the object is deleted */ OBJECT_STATE_STALE, }; /** * A represenation of a reference to a VPP object. * the reference counting is held through the use of shared pointers. * We also maintain the state of the object ready for mark n' sweep. */ class object_ref { public: /** * Constructor */ object_ref(std::shared_ptr obj); /** * less than operator */ bool operator<(const object_ref& other) const; /** * Return the shared pointer */ std::shared_ptr obj() const; /** * Mark the reference object as stale */ void mark() const; /** * Clear the stale flag on the object */ void clear() const; /** * Query if the object is stale */ bool stale() const; private: /** * The reference object */ std::shared_ptr m_obj; /** * Not part of the key (in the set) so we can change it * whilst iterating */ mutable obj_state_t m_state; }; /** * ostream print of a VPP Obect */ std::ostream& operator<<(std::ostream& os, const object_base& o); }; /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "mozilla") * End: */ #endif