|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2002,2003 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef D4CEDRIVER_H_
|
|
Packit |
a4aae4 |
#define D4CEDRIVER_H_
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <string>
|
|
Packit |
a4aae4 |
#include <vector>
|
|
Packit |
a4aae4 |
#include <stack>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class location;
|
|
Packit |
a4aae4 |
class DMR;
|
|
Packit |
a4aae4 |
class BaseType;
|
|
Packit |
a4aae4 |
class Array;
|
|
Packit |
a4aae4 |
class D4Dimension;
|
|
Packit |
a4aae4 |
class D4FilterClause;
|
|
Packit |
a4aae4 |
class D4FilterClauseList;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* Driver for the DAP4 Constraint Expression parser.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
class D4ConstraintEvaluator {
|
|
Packit |
a4aae4 |
struct index {
|
|
Packit |
a4aae4 |
// start and stride are simple numbers; stop is either the stopping index or
|
|
Packit |
a4aae4 |
// if rest is true, is ignored and the subset runs to the end of the dimension
|
|
Packit |
a4aae4 |
unsigned long long start, stride, stop;
|
|
Packit |
a4aae4 |
// true if the slice indicates it does not contain a specific 'stop' value but
|
|
Packit |
a4aae4 |
// goes to the end, whatever that value is.
|
|
Packit |
a4aae4 |
bool rest;
|
|
Packit |
a4aae4 |
// An empty slice ([]) means either the entire dimension or apply the shared
|
|
Packit |
a4aae4 |
// dimension slice, depending on whether the corresponding shared dimension has
|
|
Packit |
a4aae4 |
// been sliced.
|
|
Packit |
a4aae4 |
bool empty;
|
|
Packit |
a4aae4 |
// When a slice is applied to an Array with Maps, we need to know the name of
|
|
Packit |
a4aae4 |
// each dimension. These names are then used to apply the slice to each of the
|
|
Packit |
a4aae4 |
// Maps (Maps may have fewer dimensions than the Array, but the idea that a
|
|
Packit |
a4aae4 |
// Map is a simple vector doesn't hold for DAP4, so the mapping between a slice's
|
|
Packit |
a4aae4 |
// indexes and the set of Maps can be complex - use the names to make sure
|
|
Packit |
a4aae4 |
// all cases are covered. The value of this field may be empty.
|
|
Packit |
a4aae4 |
std::string dim_name;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Added because the parser code needs it. Our code does not use this. jhrg 11/26/13
|
|
Packit |
a4aae4 |
index(): start(0), stride(0), stop(0), rest(false), empty(false), dim_name("") {}
|
|
Packit |
a4aae4 |
index(unsigned long long i, unsigned long long s, unsigned long long e, bool r, bool em, const std::string &n)
|
|
Packit |
a4aae4 |
: start(i), stride(s), stop(e), rest(r), empty(em), dim_name(n) {}
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
index make_index() { return index(0, 1, 0, true /*rest*/, true /*empty*/, ""); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
index make_index(const std::string &is);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
index make_index(const std::string &i, const std::string &s, const std::string &e);
|
|
Packit |
a4aae4 |
index make_index(const std::string &i, unsigned long long s, const std::string &e);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
index make_index(const std::string &i, const std::string &s);
|
|
Packit |
a4aae4 |
index make_index(const std::string &i, unsigned long long s);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool d_trace_scanning;
|
|
Packit |
a4aae4 |
bool d_trace_parsing;
|
|
Packit |
a4aae4 |
bool d_result;
|
|
Packit |
a4aae4 |
std::string d_expr;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DMR *d_dmr;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
std::vector<index> d_indexes;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
std::stack<BaseType*> d_basetype_stack;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// d_expr should be set by parse! Its value is used by the parser right before
|
|
Packit |
a4aae4 |
// the actual parsing operation starts. jhrg 11/26/13
|
|
Packit |
a4aae4 |
std::string *expression() { return &d_expr; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void search_for_and_mark_arrays(BaseType *btp);
|
|
Packit |
a4aae4 |
BaseType *mark_variable(BaseType *btp);
|
|
Packit |
a4aae4 |
BaseType *mark_array_variable(BaseType *btp);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Dimension *slice_dimension(const std::string &id, const index &i);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void push_index(const index &i) { d_indexes.push_back(i); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void push_basetype(BaseType *btp) { d_basetype_stack.push(btp); }
|
|
Packit |
a4aae4 |
BaseType *top_basetype() const { return d_basetype_stack.empty() ? 0 : d_basetype_stack.top(); }
|
|
Packit |
a4aae4 |
// throw on pop with an empty stack?
|
|
Packit |
a4aae4 |
void pop_basetype() { d_basetype_stack.pop(); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void throw_not_found(const std::string &id, const std::string &ident);
|
|
Packit |
a4aae4 |
void throw_not_array(const std::string &id, const std::string &ident);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Build FilterClauseList for filter clauses for a Sequence
|
|
Packit |
a4aae4 |
void add_filter_clause(const std::string &op, const std::string &arg1, const std::string &arg2);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
std::string &remove_quotes(std::string &src;;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
friend class D4CEParser;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
D4ConstraintEvaluator() : d_trace_scanning(false), d_trace_parsing(false), d_result(false), d_expr(""), d_dmr(0) { }
|
|
Packit |
a4aae4 |
D4ConstraintEvaluator(DMR *dmr) : d_trace_scanning(false), d_trace_parsing(false), d_result(false), d_expr(""), d_dmr(dmr) { }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual ~D4ConstraintEvaluator() { }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool parse(const std::string &expr;;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool trace_scanning() const { return d_trace_scanning; }
|
|
Packit |
a4aae4 |
void set_trace_scanning(bool ts) { d_trace_scanning = ts; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool trace_parsing() const { return d_trace_parsing; }
|
|
Packit |
a4aae4 |
void set_trace_parsing(bool tp) { d_trace_parsing = tp; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool result() const { return d_result; }
|
|
Packit |
a4aae4 |
void set_result(bool r) { d_result = r; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DMR *dmr() const { return d_dmr; }
|
|
Packit |
a4aae4 |
void set_dmr(DMR *dmr) { d_dmr = dmr; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void error(const libdap::location &l, const std::string &m);
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} /* namespace libdap */
|
|
Packit |
a4aae4 |
#endif /* D4CEDRIVER_H_ */
|