xorp

single_varrw.hh

00001 // -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
00002 // vim:set sts=4 ts=8:
00003 
00004 // Copyright (c) 2001-2011 XORP, Inc and Others
00005 //
00006 // This program is free software; you can redistribute it and/or modify
00007 // it under the terms of the GNU General Public License, Version 2, June
00008 // 1991 as published by the Free Software Foundation. Redistribution
00009 // and/or modification of this program under the terms of any other
00010 // version of the GNU General Public License is not permitted.
00011 // 
00012 // This program is distributed in the hope that it will be useful, but
00013 // WITHOUT ANY WARRANTY; without even the implied warranty of
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
00015 // see the GNU General Public License, Version 2, a copy of which can be
00016 // found in the XORP LICENSE.gpl file.
00017 // 
00018 // XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
00019 // http://xorp.net
00020 
00021 // $XORP: xorp/policy/backend/single_varrw.hh,v 1.15 2008/10/02 21:58:05 bms Exp $
00022 
00023 #ifndef __POLICY_BACKEND_SINGLE_VARRW_HH__
00024 #define __POLICY_BACKEND_SINGLE_VARRW_HH__
00025 
00026 
00027 
00028 
00029 
00030 #include "policy/common/varrw.hh"
00031 #include "policy/common/policy_utils.hh"
00032 #include "policy/common/element_base.hh"
00033 #include "policytags.hh"
00034 
00044 class SingleVarRW :
00045     public NONCOPYABLE,
00046     public VarRW
00047 {
00048 public:
00052     class SingleVarRWErr : public PolicyException {
00053     public:
00054     SingleVarRWErr(const char* file, size_t line, 
00055                const string& init_why = "")   
00056             : PolicyException("SingleVarRWErr", file, line, init_why) {} 
00057     };
00058 
00059     SingleVarRW();
00060     virtual ~SingleVarRW();
00061 
00068     const Element& read(const Id& id);
00069 
00076     void write(const Id& id, const Element& e);
00077 
00086     void sync();
00087 
00088     // XXX: be smart: register callback for element writing
00101     void initialize(const Id& id, Element* e);
00102     
00103     void initialize(PolicyTags& pt);
00104 
00109     virtual void start_read() {} 
00110 
00115     virtual void start_write() {}
00116 
00125     virtual void single_write(const Id& id, const Element& e) = 0;
00126 
00135     virtual Element* single_read(const Id& id) = 0;
00136 
00140     virtual void end_write() {}
00141 
00142 private:
00143     Element*        _trash[16];
00144     unsigned        _trashc;
00145     const Element*  _elems[VAR_MAX];    // Map that caches element read/writes 
00146     bool        _modified[VAR_MAX]; // variable id's that changed
00147     bool        _did_first_read;
00148     PolicyTags*     _pt;
00149 };
00150 
00151 #endif // __POLICY_BACKEND_SINGLE_VARRW_HH__
 All Classes Namespaces Functions Variables Typedefs Enumerations