|
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) 2013 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 D4ENUMDEF_H_
|
|
Packit |
a4aae4 |
#define D4ENUMDEF_H_
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <string>
|
|
Packit |
a4aae4 |
#include <vector>
|
|
Packit |
a4aae4 |
#include <algorithm>
|
|
Packit |
a4aae4 |
#include <functional>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "BaseType.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace std;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class D4EnumDefs;
|
|
Packit |
a4aae4 |
class D4Group;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class D4EnumDef {
|
|
Packit |
a4aae4 |
string d_name;
|
|
Packit |
a4aae4 |
Type d_type;
|
|
Packit |
a4aae4 |
D4EnumDefs *d_parent;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
struct tuple {
|
|
Packit |
a4aae4 |
string label;
|
|
Packit |
a4aae4 |
long long value;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
tuple(const string &l, long long v) : label(l), value(v) {}
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
vector<tuple> d_tuples;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void m_duplicate(const D4EnumDef &rhs)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
d_name = rhs.d_name;
|
|
Packit |
a4aae4 |
d_type = rhs.d_type;
|
|
Packit |
a4aae4 |
d_parent = rhs.d_parent;
|
|
Packit |
a4aae4 |
d_tuples = rhs.d_tuples;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void print_value(XMLWriter &xml, const D4EnumDef::tuple &tuple) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
typedef vector<tuple>::iterator D4EnumValueIter;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4EnumDef() : d_name(""), d_type(dods_null_c), d_parent(0) {}
|
|
Packit |
a4aae4 |
D4EnumDef(const string &n, const Type &t, D4EnumDefs *e = 0) : d_name(n), d_type(t), d_parent(e) {}
|
|
Packit |
a4aae4 |
D4EnumDef(const D4EnumDef &rhs) {
|
|
Packit |
a4aae4 |
m_duplicate(rhs);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string name() const { return d_name; }
|
|
Packit |
a4aae4 |
void set_name(const string &n) { d_name = n; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Type type() const { return d_type; }
|
|
Packit |
a4aae4 |
void set_type(Type t) { d_type = t; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4EnumDefs *parent() const { return d_parent; }
|
|
Packit |
a4aae4 |
void set_parent(D4EnumDefs *e) { d_parent = e; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool empty() const { return d_tuples.empty(); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void add_value(const string &label, long long value) {
|
|
Packit |
a4aae4 |
d_tuples.push_back(tuple(label, value));
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4EnumValueIter value_begin() { return d_tuples.begin(); }
|
|
Packit |
a4aae4 |
D4EnumValueIter value_end() { return d_tuples.end(); }
|
|
Packit |
a4aae4 |
string &label(D4EnumValueIter i) { return (*i).label; }
|
|
Packit |
a4aae4 |
long long value(D4EnumValueIter i) { return (*i).value; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool is_valid_enum_value(long long value);
|
|
Packit |
a4aae4 |
void print_dap4(XMLWriter &xml) const;
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** The Enumerations defined for a Group. */
|
|
Packit |
a4aae4 |
class D4EnumDefs {
|
|
Packit |
a4aae4 |
vector<D4EnumDef*> d_enums;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Group *d_parent; // the group that holds this set of D4EnumDefs; weak pointer, don't delete
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void m_print_enum(XMLWriter &xml, D4EnumDef *e) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void m_duplicate(const D4EnumDefs &rhs) {
|
|
Packit |
a4aae4 |
D4EnumDefCIter i = rhs.d_enums.begin();
|
|
Packit |
a4aae4 |
while (i != rhs.d_enums.end()) {
|
|
Packit |
a4aae4 |
d_enums.push_back(new D4EnumDef(**i++)); // deep copy
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
d_parent = rhs.d_parent;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
typedef vector<D4EnumDef*>::iterator D4EnumDefIter;
|
|
Packit |
a4aae4 |
typedef vector<D4EnumDef*>::const_iterator D4EnumDefCIter;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4EnumDefs() : d_parent(0) {}
|
|
Packit |
a4aae4 |
D4EnumDefs(const D4EnumDefs &rhs) {
|
|
Packit |
a4aae4 |
m_duplicate(rhs);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual ~D4EnumDefs() {
|
|
Packit |
a4aae4 |
D4EnumDefIter i = d_enums.begin();
|
|
Packit |
a4aae4 |
while(i != d_enums.end()) {
|
|
Packit |
a4aae4 |
delete *i++;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4EnumDefs &operator=(const D4EnumDefs &rhs) {
|
|
Packit |
a4aae4 |
if (this == &rhs) return *this;
|
|
Packit |
a4aae4 |
m_duplicate(rhs);
|
|
Packit |
a4aae4 |
return *this;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool empty() const { return d_enums.empty(); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Group *parent() const { return d_parent; }
|
|
Packit |
a4aae4 |
void set_parent(D4Group *p) { d_parent = p; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Append a new D4EnumDef.
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @param enum_def The enumeration.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
void add_enum(D4EnumDef *enum_def) {
|
|
Packit |
a4aae4 |
add_enum_nocopy(new D4EnumDef(*enum_def));
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
void add_enum_nocopy(D4EnumDef *enum_def) {
|
|
Packit |
a4aae4 |
enum_def->set_parent(this);
|
|
Packit |
a4aae4 |
d_enums.push_back(enum_def);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// Get an iterator to the start of the enumerations
|
|
Packit |
a4aae4 |
D4EnumDefIter enum_begin() { return d_enums.begin(); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// Get an iterator to the end of the enumerations
|
|
Packit |
a4aae4 |
D4EnumDefIter enum_end() { return d_enums.end(); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4EnumDef *find_enum_def(const string &name);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* @brief Insert a D4EnumDef.
|
|
Packit |
a4aae4 |
* Insert a D4EnumDef before the position specified by the iterator.
|
|
Packit |
a4aae4 |
* @note Calling this method invalidates all iterators that reference this
|
|
Packit |
a4aae4 |
* D4EnumDef object.
|
|
Packit |
a4aae4 |
* @param enum_def Make a deep copy and insert the enumeration definition
|
|
Packit |
a4aae4 |
* @param i iterator
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
void insert_enum(D4EnumDef *enum_def, D4EnumDefIter i) {
|
|
Packit |
a4aae4 |
D4EnumDef *enum_def_copy = new D4EnumDef(*enum_def);
|
|
Packit |
a4aae4 |
enum_def_copy->set_parent(this);
|
|
Packit |
a4aae4 |
d_enums.insert(i, enum_def_copy);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void print_dap4(XMLWriter &xml, bool constrained = false) const;
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} /* namespace libdap */
|
|
Packit |
a4aae4 |
#endif /* D4ENUMDEF_H_ */
|