blob: 2edafc5846647cff2d2f3ce0e0210725a0bd90ef [file] [log] [blame]
/*
* 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 <memory>
#include <string>
#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<object_base> obj);
/**
* less than operator
*/
bool operator<(const object_ref& other) const;
/**
* Return the shared pointer
*/
std::shared_ptr<object_base> 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<object_base> 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