Source: ../../policy/node.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// vim:set sts=4 ts=8:
// Copyright (c) 2001-2009 XORP, Inc.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, Version 2, June
// 1991 as published by the Free Software Foundation. Redistribution
// and/or modification of this program under the terms of any other
// version of the GNU General Public License is not permitted.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
// see the GNU General Public License, Version 2, a copy of which can be
// found in the XORP LICENSE.gpl file.
//
// XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
// http://xorp.net
// $XORP: xorp/policy/node.hh,v 1.18 2009/01/05 18:31:03 jtc Exp $
#ifndef __POLICY_NODE_HH__
#define __POLICY_NODE_HH__
#include "policy/common/operator_base.hh"
#include "policy/common/varrw.hh"
#include "node_base.hh"
#include "visitor.hh"
#include <string>
/**
* @short A generic node wrapper.
*/
template<class T>
class NodeAny : public Node {
public:
/**
* @param val the value of the node.
* @param line the line of the configuration where the node was created.
*/
NodeAny(const T& val, unsigned line) : Node(line), _val(val) {}
// semicolon for kdoc
DEFINE_VISITABLE();
/**
* @return the value of the node.
*/
const T& val() const { return _val; }
private:
T _val;
};
/**
* A node that holds a variable [such as aspath].
*/
typedef NodeAny<string> NodeVar;
/**
* @short A node which holds an element.
*
* Such as an IP address.
*/
class NodeElem : public Node {
public:
/**
* The node owns the element. Caller must not modify / delete.
*
* @param elem the element to hold.
* @param line line of configuration where node was created.
*/
NodeElem(Element* elem, unsigned line) : Node(line), _elem(elem) {}
~NodeElem() { delete _elem; }
DEFINE_VISITABLE();
/**
* @return the element in this node.
*/
const Element& val() const { return *_elem; }
private:
Element* _elem;
// not impl
NodeElem(const NodeElem&);
NodeElem& operator=(const NodeElem&);
};
/**
* @short A node which holds a set.
*
* The set name is only stored, as the SetMap is used for dereferencing.
*/
class NodeSet : public Node {
public:
/**
* @param c_str the name of the set.
* @param line line of configuration where node was created.
*/
NodeSet(const char* c_str, unsigned line) : Node(line), _setid(c_str) {}
DEFINE_VISITABLE();
/**
* @return the name of the set.
*/
const string& setid() const { return _setid; }
private:
string _setid;
};
/**
* @short A node for a binary operation.
*
* The node will thus have two children. It owns both of them.
*
*/
class NodeBin : public Node {
public:
/**
* Caller must not delete / modify pointers.
*
* @param op binary operation of node.
* @param left first argument of operation.
* @param right second argument of operation.
* @param line line where node was created.
*/
NodeBin(BinOper* op, Node* left, Node* right, unsigned line) : Node(line),
_op(op), _left(left), _right(right) {}
~NodeBin() {
delete _op;
delete _left;
delete _right;
}
DEFINE_VISITABLE();
/**
* @return operation associated with node.
*/
const BinOper& op() const { return *_op; }
/**
* @return first argument of operation.
*/
Node& left() const { return *_left; }
/**
* @return second argument of operation.
*/
Node& right() const { return *_right; }
private:
BinOper* _op;
Node *_left;
Node *_right;
// not impl
NodeBin(const NodeBin&);
NodeBin& operator=(const NodeBin&);
};
/**
* @short Unary operation.
*
* The node will have one child. It owns it.
*/
class NodeUn : public Node {
public:
/**
* Caller must not delete / modify pointers.
*
* @param op unary operation associated with node.
* @param node child of node -- argument of operation.
* @param line line of configuration where node was created.
*/
NodeUn(UnOper* op, Node* node, unsigned line) : Node(line), _op(op), _node(node) {}
~NodeUn() {
delete _op;
delete _node;
}
DEFINE_VISITABLE();
/**
* @return unary operation associated with node.
*/
const UnOper& op() const { return *_op; }
/**
* @return argument of unary operation.
*/
Node& node() const { return *_node; }
private:
UnOper* _op;
Node* _node;
// not impl
NodeUn(const NodeUn&);
NodeUn& operator=(const NodeUn&);
};
/**
* @short An assignment operation.
*/
class NodeAssign : public Node {
public:
/**
* Caller must not delete / modify pointer.
*
* @param varid the name of the variable being assigned to.
* @param mod the modifier (e.g., += has a modifier OpAdd).
* @param rvalue the expression being assigned to the variable.
* @param line line of configuration where node was created.
*/
NodeAssign(const string& varid, BinOper* mod, Node* rvalue, unsigned line)
: Node(line), _varid(varid), _mod(mod), _rvalue(rvalue) {}
~NodeAssign() { delete _rvalue; delete _mod; }
DEFINE_VISITABLE();
/**
* @return name of variable being assigned to.
*/
const string& varid() const { return _varid; }
/**
* @return argument of assignment.
*/
Node& rvalue() const { return *_rvalue; }
BinOper* mod() const { return _mod; }
private:
string _varid;
BinOper* _mod;
Node* _rvalue;
// not impl
NodeAssign(const NodeAssign&);
NodeAssign& operator=(const NodeAssign&);
};
/**
* @short Node representing an accept statement.
*/
class NodeAccept : public Node {
public:
/**
* @param line line of configuration where node was created.
*/
NodeAccept(unsigned line) : Node(line) {}
DEFINE_VISITABLE();
/**
* Test whether this is "accept" or "reject" statement.
*
* @return true if this is "accept" or "reject" statement.
*/
virtual bool is_accept_or_reject() const { return (true); }
};
/**
* @short Node representing a reject statement.
*/
class NodeReject : public Node {
public:
/**
* @param line line of configuration where node was created.
*/
NodeReject(unsigned line) : Node(line) {}
DEFINE_VISITABLE();
/**
* Test whether this is "accept" or "reject" statement.
*
* @return true if this is "accept" or "reject" statement.
*/
virtual bool is_accept_or_reject() const { return (true); }
};
/**
* @short Node representing a protocol statement.
*/
class NodeProto : public Node {
public:
/**
* @param protocol the protocol of the statement.
* @param line line of configuration where node was created.
*/
NodeProto(const string& proto, unsigned line) : Node(line), _proto(proto) {}
DEFINE_VISITABLE();
/**
* Test whether this is a "protocol" statement.
*
* @return true if this is a "protocol" statement.
*/
virtual bool is_protocol_statement() const { return (true); }
/**
* @return the protocol being referenced.
*/
const string& proto() const { return _proto; }
private:
string _proto;
};
class NodeNext : public Node {
public:
enum Flow {
POLICY = 0,
TERM
};
NodeNext(unsigned line, Flow f) : Node(line), _flow(f) {}
DEFINE_VISITABLE();
Flow flow() const { return _flow; }
private:
Flow _flow;
};
class NodeSubr : public Node {
public:
NodeSubr(unsigned line, string policy) : Node(line), _policy(policy) {}
DEFINE_VISITABLE();
string policy() const { return _policy; }
private:
string _policy;
};
#endif // __POLICY_NODE_HH__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:02 2009, using kdoc 2.0a54+XORP.