libdap Updated for version 3.21.1
libdap4 is an implementation of OPeNDAP's DAP protocol.
D4EnumDefs.h
Go to the documentation of this file.
1// -*- mode: c++; c-basic-offset:4 -*-
2
3// This file is part of libdap, A C++ implementation of the OPeNDAP Data
4// Access Protocol.
5
6// Copyright (c) 2013 OPeNDAP, Inc.
7// Author: James Gallagher <jgallagher@opendap.org>
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or (at your option) any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
24
25#ifndef D4ENUMDEF_H_
26#define D4ENUMDEF_H_
27
28#include <algorithm>
29#include <functional>
30#include <string>
31#include <vector>
32
33#include "BaseType.h"
34
35using namespace std;
36
37namespace libdap {
38
39class D4EnumDefs;
40class D4Group;
41
42class D4EnumDef {
43 string d_name;
44 Type d_type;
45 D4EnumDefs *d_parent; // a weak pointer, do not delete
46
47 struct tuple {
48 string label;
49 long long value;
50
51 tuple(const string &l, long long v) : label(l), value(v) {}
52 };
53
54 vector<tuple> d_tuples;
55
56 void m_duplicate(const D4EnumDef &rhs) {
57 d_name = rhs.d_name;
58 d_type = rhs.d_type;
59 d_parent = rhs.d_parent;
60 d_tuples = rhs.d_tuples;
61 }
62
63 void print_value(XMLWriter &xml, const D4EnumDef::tuple &tuple) const;
64
65public:
67
68 D4EnumDef() : d_name(""), d_type(dods_null_c), d_parent(0) {}
69 D4EnumDef(const string &n, const Type &t, D4EnumDefs *e = 0) : d_name(n), d_type(t), d_parent(e) {}
70 D4EnumDef(const D4EnumDef &rhs) { m_duplicate(rhs); }
71
72 virtual ~D4EnumDef() {}
73
75 if (this == &rhs)
76 return *this;
77 m_duplicate(rhs);
78 return *this;
79 }
80
81 string name() const { return d_name; }
82 void set_name(const string &n) { d_name = n; }
83
84 Type type() const { return d_type; }
85 void set_type(Type t) { d_type = t; }
86
87 D4EnumDefs *parent() const { return d_parent; }
88 void set_parent(D4EnumDefs *e) { d_parent = e; }
89
90 bool empty() const { return d_tuples.empty(); }
91
92 void add_value(const string &label, long long value) { d_tuples.push_back(tuple(label, value)); }
93
94 D4EnumValueIter value_begin() { return d_tuples.begin(); }
95 D4EnumValueIter value_end() { return d_tuples.end(); }
96 string &label(D4EnumValueIter i) { return (*i).label; }
97 long long value(D4EnumValueIter i) { return (*i).value; }
98
99 bool is_valid_enum_value(long long value);
100 void print_dap4(XMLWriter &xml) const;
101};
102
105 vector<D4EnumDef *> d_enums;
106
107 D4Group *d_parent; // the group that holds this set of D4EnumDefs; weak pointer, don't delete
108
109 void m_print_enum(XMLWriter &xml, D4EnumDef *e) const;
110
111 void m_duplicate(const D4EnumDefs &rhs) {
112 D4EnumDefCIter i = rhs.d_enums.begin();
113 while (i != rhs.d_enums.end()) {
114 d_enums.push_back(new D4EnumDef(**i++)); // deep copy
115 }
116
117 d_parent = rhs.d_parent;
118 }
119
120public:
123
124 D4EnumDefs() : d_parent(0) {}
125 D4EnumDefs(const D4EnumDefs &rhs) { m_duplicate(rhs); }
126
127 virtual ~D4EnumDefs() {
128 D4EnumDefIter i = d_enums.begin();
129 while (i != d_enums.end()) {
130 delete *i++;
131 }
132 }
133
135 if (this == &rhs)
136 return *this;
137 m_duplicate(rhs);
138 return *this;
139 }
140
141 bool empty() const { return d_enums.empty(); }
142
143 D4Group *parent() const { return d_parent; }
144 void set_parent(D4Group *p) { d_parent = p; }
145
150 void add_enum(D4EnumDef *enum_def) { add_enum_nocopy(new D4EnumDef(*enum_def)); }
151 void add_enum_nocopy(D4EnumDef *enum_def) {
152 enum_def->set_parent(this);
153 d_enums.push_back(enum_def);
154 }
155
157 D4EnumDefIter enum_begin() { return d_enums.begin(); }
158
160 D4EnumDefIter enum_end() { return d_enums.end(); }
161
162 D4EnumDef *find_enum_def(const string &name);
163
173 D4EnumDef *enum_def_copy = new D4EnumDef(*enum_def);
174 enum_def_copy->set_parent(this);
175 d_enums.insert(i, enum_def_copy);
176 }
177
178 void print_dap4(XMLWriter &xml, bool constrained = false) const;
179};
180
181} /* namespace libdap */
182#endif /* D4ENUMDEF_H_ */
D4EnumValueIter value_end()
Definition D4EnumDefs.h:95
virtual ~D4EnumDef()
Definition D4EnumDefs.h:72
D4EnumDefs * parent() const
Definition D4EnumDefs.h:87
string & label(D4EnumValueIter i)
Definition D4EnumDefs.h:96
Type type() const
Definition D4EnumDefs.h:84
vector< tuple >::iterator D4EnumValueIter
Definition D4EnumDefs.h:66
void set_name(const string &n)
Definition D4EnumDefs.h:82
void set_type(Type t)
Definition D4EnumDefs.h:85
long long value(D4EnumValueIter i)
Definition D4EnumDefs.h:97
bool empty() const
Definition D4EnumDefs.h:90
D4EnumDef(const D4EnumDef &rhs)
Definition D4EnumDefs.h:70
void add_value(const string &label, long long value)
Definition D4EnumDefs.h:92
D4EnumDef(const string &n, const Type &t, D4EnumDefs *e=0)
Definition D4EnumDefs.h:69
D4EnumValueIter value_begin()
Definition D4EnumDefs.h:94
void print_dap4(XMLWriter &xml) const
Definition D4EnumDefs.cc:99
void set_parent(D4EnumDefs *e)
Definition D4EnumDefs.h:88
D4EnumDef & operator=(const D4EnumDef &rhs)
Definition D4EnumDefs.h:74
string name() const
Definition D4EnumDefs.h:81
bool is_valid_enum_value(long long value)
Definition D4EnumDefs.cc:42
vector< D4EnumDef * >::iterator D4EnumDefIter
Definition D4EnumDefs.h:121
virtual ~D4EnumDefs()
Definition D4EnumDefs.h:127
bool empty() const
Definition D4EnumDefs.h:141
void insert_enum(D4EnumDef *enum_def, D4EnumDefIter i)
Insert a D4EnumDef. Insert a D4EnumDef before the position specified by the iterator.
Definition D4EnumDefs.h:172
void print_dap4(XMLWriter &xml, bool constrained=false) const
void set_parent(D4Group *p)
Definition D4EnumDefs.h:144
D4EnumDefIter enum_end()
Get an iterator to the end of the enumerations.
Definition D4EnumDefs.h:160
void add_enum(D4EnumDef *enum_def)
Definition D4EnumDefs.h:150
void add_enum_nocopy(D4EnumDef *enum_def)
Definition D4EnumDefs.h:151
D4EnumDefs & operator=(const D4EnumDefs &rhs)
Definition D4EnumDefs.h:134
D4EnumDefs(const D4EnumDefs &rhs)
Definition D4EnumDefs.h:125
D4EnumDefIter enum_begin()
Get an iterator to the start of the enumerations.
Definition D4EnumDefs.h:157
vector< D4EnumDef * >::const_iterator D4EnumDefCIter
Definition D4EnumDefs.h:122
D4Group * parent() const
Definition D4EnumDefs.h:143
D4EnumDef * find_enum_def(const string &name)
Definition D4EnumDefs.cc:76
STL iterator class.
STL iterator class.
top level DAP object to house generic methods
Definition AISConnect.cc:30
Type
Identifies the data type.
Definition Type.h:94
@ dods_null_c
Definition Type.h:95