Scarab  v2.0.0
Project 8 C++ Utility Library
param_array.hh
Go to the documentation of this file.
1 /*
2  * param_array.hh
3  *
4  * Created on: Jan 14, 2014
5  * Author: nsoblath
6  */
7 
8 #ifndef SCARAB_PARAM_ARRAY_HH_
9 #define SCARAB_PARAM_ARRAY_HH_
10 
11 #include "param_value.hh"
12 
13 #include <boost/iterator/iterator_adaptor.hpp>
14 #include <boost/type_traits/is_convertible.hpp>
15 #include <boost/utility/enable_if.hpp>
16 #include <boost/iterator/indirect_iterator.hpp>
17 
18 #include <deque>
19 
20 
21 namespace scarab
22 {
23  class param_value;
24  class param_node;
25 
26  typedef std::deque< param* > param_array_contents;
27 
28  typedef boost::indirect_iterator< param_array_contents::iterator, param > param_array_iterator;
29  typedef boost::indirect_iterator< param_array_contents::const_iterator, const param > param_array_const_iterator;
30 
31  class SCARAB_API param_array : public param
32  {
33  public:
34  typedef param_array_contents contents;
35  typedef param_array_iterator iterator;
36  typedef param_array_const_iterator const_iterator;
37  typedef contents::reverse_iterator reverse_iterator;
38  typedef contents::const_reverse_iterator const_reverse_iterator;
39  typedef contents::value_type contents_type;
40 
41  public:
42  param_array();
43  param_array( const param_array& orig );
44  virtual ~param_array();
45 
46  param_array& operator=( const param_array& rhs );
47 
48  virtual param* clone() const;
49 
50  virtual bool is_null() const;
51  virtual bool is_array() const;
52 
53  virtual bool has_subset( const param& a_subset ) const;
54 
55  unsigned size() const;
56  bool empty() const;
57 
60  void resize( unsigned a_size );
61 
64  std::string get_value( unsigned a_index ) const;
67  template< typename XValType >
68  XValType get_value( unsigned a_index ) const;
69 
72  std::string get_value( unsigned a_index, const std::string& a_default ) const;
73  std::string get_value( unsigned a_index, const char* a_default ) const;
76  template< typename XValType >
77  XValType get_value( unsigned a_index, XValType a_default ) const;
78 
81  const param& at( unsigned a_index ) const;
84  param& at( unsigned a_index );
85 
88  const param_value& value_at( unsigned a_index ) const;
91  param_value& value_at( unsigned a_index );
92 
95  const param_array& array_at( unsigned a_index ) const;
98  param_array& array_at( unsigned a_index );
99 
102  const param_node& node_at( unsigned a_index ) const;
105  param_node& node_at( unsigned a_index );
106 
109  const param& operator[]( unsigned a_index ) const;
112  param& operator[]( unsigned a_index );
113 
114  const param& front() const;
115  param& front();
116 
117  const param& back() const;
118  param& back();
119 
120  // assign a copy of a_value to the array at a_index
121  void assign( unsigned a_index, const param& a_value );
122  // directly assign a_value_ptr to the array at a_index
123  void assign( unsigned a_index, param* a_value_ptr );
124 
125  void push_back( const param& a_value );
126  void push_back( param* a_value_ptr );
127 
128  void push_front( const param& a_value );
129  void push_front( param* a_value_ptr );
130 
131  void append( const param_array& an_array );
132 
133  void erase( unsigned a_index );
134  param* remove( unsigned a_index );
135  void clear();
136 
137  iterator begin();
138  const_iterator begin() const;
139 
140  iterator end();
141  const_iterator end() const;
142 
143  reverse_iterator rbegin();
144  const_reverse_iterator rbegin() const;
145 
146  reverse_iterator rend();
147  const_reverse_iterator rend() const;
148 
149  virtual std::string to_string() const;
150 
151  protected:
152  contents f_contents;
153  };
154 
155 
156  template< typename XValType >
157  XValType param_array::get_value( unsigned a_index ) const
158  {
159  return value_at( a_index ).get< XValType >();
160  }
161 
162  template< typename XValType >
163  XValType param_array::get_value( unsigned a_index, XValType a_default ) const
164  {
165  return a_index < size() ? value_at( a_index ).get< XValType >() : a_default;
166  }
167 
168  inline param* param_array::clone() const
169  {
170  return new param_array( *this );
171  }
172 
173  inline bool param_array::is_null() const
174  {
175  return false;
176  }
177 
178  inline bool param_array::is_array() const
179  {
180  return true;
181  }
182 
183  inline unsigned param_array::size() const
184  {
185  return f_contents.size();
186  }
187  inline bool param_array::empty() const
188  {
189  return f_contents.empty();
190  }
191 
192  inline std::string param_array::get_value( unsigned a_index ) const
193  {
194  return value_at( a_index ).to_string();
195  }
196 
197  inline std::string param_array::get_value( unsigned a_index, const std::string& a_default ) const
198  {
199  return a_index < size() ? value_at( a_index ).to_string() : a_default;
200  }
201 
202  inline std::string param_array::get_value( unsigned a_index, const char* a_default ) const
203  {
204  return get_value( a_index, std::string( a_default ) );
205  }
206 
207  inline const param& param_array::at( unsigned a_index ) const
208  {
209  return *f_contents.at( a_index );
210  }
211  inline param& param_array::at( unsigned a_index )
212  {
213  return *f_contents.at( a_index );
214  }
215 
216  inline const param_value& param_array::value_at( unsigned a_index ) const
217  {
218  return at( a_index ).as_value();
219  }
220  inline param_value& param_array::value_at( unsigned a_index )
221  {
222  return at( a_index ).as_value();
223  }
224 
225  inline const param_array& param_array::array_at( unsigned a_index ) const
226  {
227  return at( a_index ).as_array();
228  }
229  inline param_array& param_array::array_at( unsigned a_index )
230  {
231  return at( a_index ).as_array();
232  }
233 
234  inline const param_node& param_array::node_at( unsigned a_index ) const
235  {
236  return at( a_index ).as_node();
237  }
238  inline param_node& param_array::node_at( unsigned a_index )
239  {
240  return at( a_index ).as_node();
241  }
242 
243  inline const param& param_array::operator[]( unsigned a_index ) const
244  {
245  return *f_contents[ a_index ];
246  }
247  inline param& param_array::operator[]( unsigned a_index )
248  {
249  return *f_contents[ a_index ];
250  }
251 
252  inline const param& param_array::front() const
253  {
254  return *f_contents.front();
255  }
257  {
258  return *f_contents.front();
259  }
260 
261  inline const param& param_array::back() const
262  {
263  return *f_contents.back();
264  }
266  {
267  return *f_contents.back();
268  }
269 
270  // assign a copy of a_value to the array at a_index
271  inline void param_array::assign( unsigned a_index, const param& a_value )
272  {
273  erase( a_index );
274  f_contents[ a_index ] = a_value.clone();
275  return;
276  }
277  // directly assign a_value_ptr to the array at a_index
278  inline void param_array::assign( unsigned a_index, param* a_value_ptr )
279  {
280  erase( a_index );
281  f_contents[ a_index ] = a_value_ptr;
282  return;
283  }
284 
285  inline void param_array::push_back( const param& a_value )
286  {
287  f_contents.push_back( a_value.clone() );
288  return;
289  }
290  inline void param_array::push_back( param* a_value_ptr )
291  {
292  f_contents.push_back( a_value_ptr );
293  return;
294  }
295 
296  inline void param_array::push_front( const param& a_value )
297  {
298  f_contents.push_front( a_value.clone() );
299  return;
300  }
301  inline void param_array::push_front( param* a_value_ptr )
302  {
303  f_contents.push_front( a_value_ptr );
304  return;
305  }
306 
307  inline void param_array::append( const param_array& an_array )
308  {
309  for( const_iterator it = const_iterator(an_array.begin()); it != const_iterator(an_array.end()); ++it )
310  {
311  push_back( *it );
312  }
313  return;
314  }
315 
316  inline void param_array::erase( unsigned a_index )
317  {
318  delete f_contents[ a_index ];
319  f_contents[ a_index ] = NULL;
320  return;
321  }
322  inline param* param_array::remove( unsigned a_index )
323  {
324  param* t_current = f_contents[ a_index ];
325  f_contents[ a_index ] = NULL;
326  return t_current;
327  }
328  inline void param_array::clear()
329  {
330  for( unsigned ind = 0; ind < f_contents.size(); ++ind )
331  {
332  delete f_contents[ ind ];
333  }
334  f_contents.clear();
335  return;
336  }
337 
339  {
340  return iterator( f_contents.begin() );
341  }
343  {
344  return const_iterator( f_contents.cbegin() );
345  }
346 
348  {
349  return iterator( f_contents.end() );
350  }
352  {
353  return const_iterator( f_contents.cend() );
354  }
355 
357  {
358  return f_contents.rbegin();
359  }
361  {
362  return f_contents.rbegin();
363  }
364 
366  {
367  return f_contents.rend();
368  }
370  {
371  return f_contents.crend();
372  }
373 
374  SCARAB_API std::ostream& operator<<(std::ostream& out, const param_array& value);
375 
376 } /* namespace scarab */
377 
378 #endif /* SCARAB_PARAM_ARRAY_HH_ */
const param_value & value_at(unsigned a_index) const
Definition: param_array.hh:216
const param & at(unsigned a_index) const
Definition: param_array.hh:207
boost::indirect_iterator< param_array_contents::iterator, param > param_array_iterator
Definition: param_array.hh:28
param_array_iterator iterator
Definition: param_array.hh:35
void push_front(const param &a_value)
Definition: param_array.hh:296
boost::indirect_iterator< param_array_contents::const_iterator, const param > param_array_const_iterator
Definition: param_array.hh:29
#define SCARAB_API
Definition: scarab_api.hh:24
virtual param * clone() const
Definition: param_array.hh:168
virtual bool is_array() const
Definition: param_array.hh:178
std::string get_value(unsigned a_index) const
Definition: param_array.hh:192
virtual bool is_null() const
Definition: param_array.hh:173
const param_array & array_at(unsigned a_index) const
Definition: param_array.hh:225
contents::const_reverse_iterator const_reverse_iterator
Definition: param_array.hh:38
param_value & as_value()
unsigned size() const
Definition: param_array.hh:183
void append(const param_array &an_array)
Definition: param_array.hh:307
param_array_contents contents
Definition: param_array.hh:34
param * remove(unsigned a_index)
Definition: param_array.hh:322
bool empty() const
Definition: param_array.hh:187
reverse_iterator rend()
Definition: param_array.hh:365
const param_node & node_at(unsigned a_index) const
Definition: param_array.hh:234
reverse_iterator rbegin()
Definition: param_array.hh:356
SCARAB_API std::ostream & operator<<(std::ostream &out, const param_array &a_value)
Definition: param_array.cc:97
const param & operator[](unsigned a_index) const
Definition: param_array.hh:243
param_node & as_node()
std::string to_string(std::uint64_t x)
Definition: date.h:7722
const param & front() const
Definition: param_array.hh:252
void erase(unsigned a_index)
Definition: param_array.hh:316
void assign(unsigned a_index, const param &a_value)
Definition: param_array.hh:271
contents::reverse_iterator reverse_iterator
Definition: param_array.hh:37
param_array & as_array()
param_array_const_iterator const_iterator
Definition: param_array.hh:36
void push_back(const param &a_value)
Definition: param_array.hh:285
contents::value_type contents_type
Definition: param_array.hh:39
std::deque< param * > param_array_contents
Definition: param_array.hh:24
const param & back() const
Definition: param_array.hh:261
virtual param * clone() const