//
// aegis - project change supervisor
// Copyright (C) 1994, 1996, 2002-2008 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// 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. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#ifndef AEGIS_AER_STMT_H
#define AEGIS_AER_STMT_H
#include
#include
#include
enum rpt_stmt_status_ty
{
rpt_stmt_status_normal,
rpt_stmt_status_break,
rpt_stmt_status_continue,
rpt_stmt_status_return,
rpt_stmt_status_error
};
struct rpt_stmt_result_ty
{
rpt_stmt_status_ty status;
rpt_value::pointer thrown;
};
/**
* The rpt_stmt abstract base class is used to represent a generic
* statement in the statement tree used by the report generator.
*/
class rpt_stmt
{
public:
typedef aegis_shared_ptr pointer;
/**
* The destructor.
*/
virtual ~rpt_stmt();
protected:
/**
* The default constructor.
*/
rpt_stmt();
public:
/**
* The run method is used to execute the statament.
*/
virtual void run(rpt_stmt_result_ty *) const = 0;
/**
* The append method is used to append another statement node to
* the children of this statement node.
*/
void append(const pointer &child);
/**
* The prepend method is used to prepend another statement node to
* the children of this statement node.
*/
void prepend(const pointer &child);
/**
* The get_nchildren method may be used to obtain the number of
* child nodes this node has.
*/
size_t get_nchildren() const { return nchild; }
protected:
/**
* The nth_child method may be used to obtain the given child
* statement.
*
* @param n
* The shild to obtain, zero based.
* @returns
* pointer to statement node, or NULL if too high
*/
pointer nth_child(size_t n) const;
private:
/**
* The child instance variable is used to remember the base of a
* dynamically allocated array of pointers to statement nodes,
* each a child of this node.
*/
pointer *child;
/**
* The nchild instance variable is used to remember how many
* elements of the "child" array have been used to date.
*/
size_t nchild;
/**
* The nchild_max instance variable is used to remember how many
* elements of the "child" array were allocated. This is used to
* know when to allocate more.
*/
size_t nchild_max;
/**
* The copy constructor. Do not use.
*/
rpt_stmt(const rpt_stmt &);
/**
* The assignment operator. Do not use.
*/
rpt_stmt &operator=(const rpt_stmt &);
};
#endif // AEGIS_AER_STMT_H