ConstraintEvaluator.h

Go to the documentation of this file.
00001 // -*- mode: c++; c-basic-offset:4 -*-
00002 
00003 // This file is part of libdap, A C++ implementation of the OPeNDAP Data
00004 // Access Protocol.
00005 
00006 // Copyright (c) 2006 OPeNDAP, Inc.
00007 // Author: James Gallagher <jgallagher@opendap.org>
00008 //
00009 // This library is free software; you can redistribute it and/or
00010 // modify it under the terms of the GNU Lesser General Public
00011 // License as published by the Free Software Foundation; either
00012 // version 2.1 of the License, or (at your option) any later version.
00013 //
00014 // This library is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 // Lesser General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU Lesser General Public
00020 // License along with this library; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 //
00023 // You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
00024 
00025 #ifndef constraint_evaluator_h
00026 #define constraint_evaluator_h
00027 
00028 #include <list>
00029 
00030 #ifndef _clause_h
00031 #include "Clause.h"
00032 #endif
00033 
00034 namespace libdap
00035 {
00036 
00038 class ConstraintEvaluator
00039 {
00040 private:
00041     // This struct is used to hold all the known `user defined' functions
00042     // (including those that are `built-in').
00043     struct function
00044     {
00045         string name;
00046         bool_func b_func;
00047         btp_func bt_func;
00048         proj_func p_func;
00049 
00050         function(const string &n, const bool_func f)
00051                 : name(n), b_func(f), bt_func(0), p_func(0)
00052         {}
00053         function(const string &n, const btp_func f)
00054                 : name(n), bt_func(f), p_func(0)
00055         {}
00056         function(const string &n, const proj_func f)
00057                 : name(n), bt_func(0), p_func(f)
00058         {}
00059         function(): name(""), bt_func(0), p_func(0)
00060         {}
00061     };
00062 
00063     vector<Clause *> expr;      // List of CE Clauses
00064 
00065     vector<BaseType *> constants;// List of temporary objects
00066 
00067     list<function> functions; // Known external functions
00068 
00069     // The default versions of these methods will break this class. Because
00070     // Clause does not support deep copies, that class will need to be modified
00071     // before these can be properly implemented. jhrg 4/3/06
00072     ConstraintEvaluator(const ConstraintEvaluator &)
00073     {}
00074     ConstraintEvaluator &operator=(const ConstraintEvaluator &)
00075     {
00076         throw InternalErr(__FILE__, __LINE__, "Unimplemented method");
00077     }
00078 
00079     friend class func_name_is;
00080 
00081 public:
00082     typedef std::vector<Clause *>::const_iterator Clause_citer ;
00083     typedef std::vector<Clause *>::iterator Clause_iter ;
00084 
00085     typedef std::vector<BaseType *>::const_iterator Constants_citer ;
00086     typedef std::vector<BaseType *>::iterator Constants_iter ;
00087 
00088     typedef std::list<function>::const_iterator Functions_citer ;
00089     typedef std::list<function>::iterator Functions_iter ;
00090 
00091     ConstraintEvaluator();
00092     virtual ~ConstraintEvaluator();
00093 
00094     void add_function(const string &name, bool_func f);
00095     void add_function(const string &name, btp_func f);
00096     void add_function(const string &name, proj_func f);
00097 
00098     bool find_function(const string &name, bool_func *f) const;
00099     bool find_function(const string &name, btp_func *f) const;
00100     bool find_function(const string &name, proj_func *f) const;
00101 
00102     void append_clause(int op, rvalue *arg1, rvalue_list *arg2);
00103     void append_clause(bool_func func, rvalue_list *args);
00104     void append_clause(btp_func func, rvalue_list *args);
00105 
00106     bool functional_expression();
00107     bool boolean_expression();
00108     bool eval_selection(DDS &dds, const string &dataset);
00109     BaseType *eval_function(DDS &dds, const string &dataset);
00110 
00111 
00112     Clause_iter clause_begin();
00113     Clause_iter clause_end();
00114     bool clause_value(Clause_iter &i, DDS &dds/*, const string &dataset***/);
00115 
00116     void parse_constraint(const string &constraint, DDS &dds);
00117     void append_constant(BaseType *btp);
00118 
00119 };
00120 
00121 } // namespace libdap
00122 
00123 #endif // constraint_evaluator_h

Generated on Fri Apr 24 22:10:22 2009 for libdap++ by  doxygen 1.4.7