Scarab  v2.1.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< std::unique_ptr< 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  param_array( param_array&& orig );
45  virtual ~param_array();
46 
47  param_array& operator=( const param_array& rhs );
48  param_array& operator=( param_array&& rhs );
49 
50  virtual param_ptr_t clone() const;
51  virtual param_ptr_t move_clone();
52 
53  virtual bool is_null() const;
54  virtual bool is_array() const;
55 
56  virtual bool has_subset( const param& a_subset ) const;
57 
58  unsigned size() const;
59  bool empty() const;
60 
63  void resize( unsigned a_size );
64 
67  std::string get_value( unsigned a_index ) const;
70  template< typename XValType >
71  XValType get_value( unsigned a_index ) const;
72 
75  std::string get_value( unsigned a_index, const std::string& a_default ) const;
76  std::string get_value( unsigned a_index, const char* a_default ) const;
79  template< typename XValType >
80  XValType get_value( unsigned a_index, XValType a_default ) const;
81 
84  const param& at( unsigned a_index ) const;
87  param& at( unsigned a_index );
88 
91  const param_value& value_at( unsigned a_index ) const;
94  param_value& value_at( unsigned a_index );
95 
98  const param_array& array_at( unsigned a_index ) const;
101  param_array& array_at( unsigned a_index );
102 
105  const param_node& node_at( unsigned a_index ) const;
108  param_node& node_at( unsigned a_index );
109 
112  const param& operator[]( unsigned a_index ) const;
115  param& operator[]( unsigned a_index );
116 
117  const param& front() const;
118  param& front();
119 
120  const param& back() const;
121  param& back();
122 
123  // assign a copy of a_value to the array at a_index
124  void assign( unsigned a_index, const param& a_value );
125  // directly assign a_value to the array at a_index
126  void assign( unsigned a_index, param&& a_value_ptr );
127  // directly assign a_value_ptr to the array at a_index
128  void assign( unsigned a_index, param_ptr_t a_value_ptr );
129 
130  void push_back( const param& a_value );
131  void push_back( param&& a_value );
132  void push_back( param_ptr_t a_value_ptr );
133 
134  void push_front( const param& a_value );
135  void push_front( param&& a_value );
136  void push_front( param_ptr_t a_value_ptr );
137 
138  void append( const param_array& an_array );
139 
140  void erase( unsigned a_index );
141  param_ptr_t remove( unsigned a_index );
142  void clear();
143 
144  iterator begin();
145  const_iterator begin() const;
146 
147  iterator end();
148  const_iterator end() const;
149 
150  reverse_iterator rbegin();
151  const_reverse_iterator rbegin() const;
152 
153  reverse_iterator rend();
154  const_reverse_iterator rend() const;
155 
156  virtual std::string to_string() const;
157 
158  protected:
159  contents f_contents;
160  };
161 
162 
163  template< typename XValType >
164  XValType param_array::get_value( unsigned a_index ) const
165  {
166  return value_at( a_index ).get< XValType >();
167  }
168 
169  template< typename XValType >
170  XValType param_array::get_value( unsigned a_index, XValType a_default ) const
171  {
172  return a_index < size() ? value_at( a_index ).get< XValType >() : a_default;
173  }
174 
176  {
177  return std::unique_ptr< param_array >( new param_array( *this ) );
178  }
179 
181  {
182  return std::unique_ptr< param_array >( new param_array( std::move( *this ) ) );
183  }
184 
185  inline bool param_array::is_null() const
186  {
187  return false;
188  }
189 
190  inline bool param_array::is_array() const
191  {
192  return true;
193  }
194 
195  inline unsigned param_array::size() const
196  {
197  return f_contents.size();
198  }
199  inline bool param_array::empty() const
200  {
201  return f_contents.empty();
202  }
203 
204  inline void param_array::resize( unsigned a_size )
205  {
206  f_contents.resize( a_size );
207  return;
208  }
209 
210  inline std::string param_array::get_value( unsigned a_index ) const
211  {
212  return value_at( a_index ).to_string();
213  }
214 
215  inline std::string param_array::get_value( unsigned a_index, const std::string& a_default ) const
216  {
217  return a_index < size() ? value_at( a_index ).to_string() : a_default;
218  }
219 
220  inline std::string param_array::get_value( unsigned a_index, const char* a_default ) const
221  {
222  return get_value( a_index, std::string( a_default ) );
223  }
224 
225  inline const param& param_array::at( unsigned a_index ) const
226  {
227  return *f_contents.at( a_index );
228  }
229  inline param& param_array::at( unsigned a_index )
230  {
231  return *f_contents.at( a_index );
232  }
233 
234  inline const param_value& param_array::value_at( unsigned a_index ) const
235  {
236  return at( a_index ).as_value();
237  }
238  inline param_value& param_array::value_at( unsigned a_index )
239  {
240  return at( a_index ).as_value();
241  }
242 
243  inline const param_array& param_array::array_at( unsigned a_index ) const
244  {
245  return at( a_index ).as_array();
246  }
247  inline param_array& param_array::array_at( unsigned a_index )
248  {
249  return at( a_index ).as_array();
250  }
251 
252  inline const param_node& param_array::node_at( unsigned a_index ) const
253  {
254  return at( a_index ).as_node();
255  }
256  inline param_node& param_array::node_at( unsigned a_index )
257  {
258  return at( a_index ).as_node();
259  }
260 
261  inline const param& param_array::operator[]( unsigned a_index ) const
262  {
263  return *f_contents[ a_index ];
264  }
265  inline param& param_array::operator[]( unsigned a_index )
266  {
267  return *f_contents[ a_index ];
268  }
269 
270  inline const param& param_array::front() const
271  {
272  return *f_contents.front();
273  }
275  {
276  return *f_contents.front();
277  }
278 
279  inline const param& param_array::back() const
280  {
281  return *f_contents.back();
282  }
284  {
285  return *f_contents.back();
286  }
287 
288  // assign a copy of a_value to the array at a_index
289  inline void param_array::assign( unsigned a_index, const param& a_value )
290  {
291  erase( a_index );
292  f_contents[ a_index ] = a_value.clone();
293  return;
294  }
295  // directly move a_value to the array at a_index
296  inline void param_array::assign( unsigned a_index, param&& a_value )
297  {
298  erase( a_index );
299  f_contents[ a_index ] = a_value.move_clone();
300  return;
301  }
302  // directly assign a_value_ptr to the array at a_index
303  inline void param_array::assign( unsigned a_index, param_ptr_t a_value_ptr )
304  {
305  erase( a_index );
306  f_contents[ a_index ] = std::move(a_value_ptr);
307  return;
308  }
309 
310  inline void param_array::push_back( const param& a_value )
311  {
312  f_contents.push_back( a_value.clone() );
313  return;
314  }
315  inline void param_array::push_back( param&& a_value )
316  {
317  f_contents.push_back( a_value.move_clone() );
318  return;
319  }
320  inline void param_array::push_back( param_ptr_t a_value_ptr )
321  {
322  f_contents.push_back( std::move(a_value_ptr) );
323  return;
324  }
325 
326  inline void param_array::push_front( const param& a_value )
327  {
328  f_contents.push_front( a_value.clone() );
329  return;
330  }
331  inline void param_array::push_front( param&& a_value )
332  {
333  f_contents.push_front( a_value.move_clone() );
334  return;
335  }
336  inline void param_array::push_front( param_ptr_t a_value_ptr )
337  {
338  f_contents.push_front( std::move(a_value_ptr) );
339  return;
340  }
341 
342  inline void param_array::append( const param_array& an_array )
343  {
344  for( const_iterator it = const_iterator(an_array.begin()); it != const_iterator(an_array.end()); ++it )
345  {
346  push_back( *it );
347  }
348  return;
349  }
350 
351  inline void param_array::erase( unsigned a_index )
352  {
353  f_contents[ a_index ].reset();
354  return;
355  }
356  inline param_ptr_t param_array::remove( unsigned a_index )
357  {
358  param_ptr_t t_current( std::move( f_contents[ a_index ] ) );
359  return t_current;
360  }
361  inline void param_array::clear()
362  {
363  f_contents.clear();
364  return;
365  }
366 
368  {
369  return iterator( f_contents.begin() );
370  }
372  {
373  return const_iterator( f_contents.cbegin() );
374  }
375 
377  {
378  return iterator( f_contents.end() );
379  }
381  {
382  return const_iterator( f_contents.cend() );
383  }
384 
386  {
387  return f_contents.rbegin();
388  }
390  {
391  return f_contents.rbegin();
392  }
393 
395  {
396  return f_contents.rend();
397  }
399  {
400  return f_contents.crend();
401  }
402 
403  SCARAB_API std::ostream& operator<<(std::ostream& out, const param_array& value);
404 
405 } /* namespace scarab */
406 
407 #endif /* SCARAB_PARAM_ARRAY_HH_ */
const param_value & value_at(unsigned a_index) const
Definition: param_array.hh:234
std::deque< std::unique_ptr< param > > param_array_contents
Definition: param_array.hh:24
const param & at(unsigned a_index) const
Definition: param_array.hh:225
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:326
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_ptr_t move_clone()
Definition: param_array.hh:180
virtual bool is_array() const
Definition: param_array.hh:190
std::string get_value(unsigned a_index) const
Definition: param_array.hh:210
virtual param_ptr_t clone() const
Definition: param_array.hh:175
virtual bool is_null() const
Definition: param_array.hh:185
const param_array & array_at(unsigned a_index) const
Definition: param_array.hh:243
contents::const_reverse_iterator const_reverse_iterator
Definition: param_array.hh:38
param_value & as_value()
unsigned size() const
Definition: param_array.hh:195
void append(const param_array &an_array)
Definition: param_array.hh:342
param_array_contents contents
Definition: param_array.hh:34
param_ptr_t remove(unsigned a_index)
Definition: param_array.hh:356
bool empty() const
Definition: param_array.hh:199
reverse_iterator rend()
Definition: param_array.hh:394
const param_node & node_at(unsigned a_index) const
Definition: param_array.hh:252
reverse_iterator rbegin()
Definition: param_array.hh:385
SCARAB_API std::ostream & operator<<(std::ostream &out, const param_array &a_value)
Definition: param_array.cc:110
std::unique_ptr< param > param_ptr_t
Definition: param_base.hh:23
const param & operator[](unsigned a_index) const
Definition: param_array.hh:261
param_node & as_node()
std::string to_string(std::uint64_t x)
Definition: date.h:7722
const param & front() const
Definition: param_array.hh:270
void erase(unsigned a_index)
Definition: param_array.hh:351
void assign(unsigned a_index, const param &a_value)
Definition: param_array.hh:289
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:310
contents::value_type contents_type
Definition: param_array.hh:39
virtual param_ptr_t clone() const
const param & back() const
Definition: param_array.hh:279
void resize(unsigned a_size)
Definition: param_array.hh:204