8 #ifndef SCARAB_PARAM_ARRAY_HH_ 9 #define SCARAB_PARAM_ARRAY_HH_ 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> 53 virtual bool is_null()
const;
54 virtual bool is_array()
const;
56 virtual bool has_subset(
const param& a_subset )
const;
58 unsigned size()
const;
63 void resize(
unsigned a_size );
67 std::string get_value(
unsigned a_index,
const std::string& a_default )
const;
68 std::string get_value(
unsigned a_index,
const char* a_default )
const;
71 template<
typename XValType >
72 XValType get_value(
unsigned a_index, XValType a_default )
const;
76 const param& operator[](
unsigned a_index )
const;
79 param& operator[](
unsigned a_index );
81 const param& front()
const;
84 const param& back()
const;
88 void assign(
unsigned a_index,
const param& a_value );
90 void assign(
unsigned a_index,
param&& a_value );
92 void assign(
unsigned a_index,
param_ptr_t a_value_ptr );
94 template< typename T, typename std::enable_if< std::is_convertible< T, param_value >::value, T >
::type* =
nullptr >
95 void assign(
unsigned a_index, T a_value );
97 void push_back(
const param& a_value );
98 void push_back(
param&& a_value );
100 template< typename T, typename std::enable_if< std::is_convertible< T, param_value >::value, T >::type* =
nullptr >
101 void push_back( T a_value );
103 void push_front(
const param& a_value );
104 void push_front(
param&& a_value );
106 template< typename T, typename std::enable_if< std::is_convertible< T, param_value >::value, T >::type* =
nullptr >
107 void push_front( T a_value );
113 void erase(
unsigned a_index );
118 const_iterator begin()
const;
121 const_iterator end()
const;
123 reverse_iterator rbegin();
124 const_reverse_iterator rbegin()
const;
126 reverse_iterator rend();
127 const_reverse_iterator rend()
const;
136 template<
typename XValType >
139 return a_index < size() ? operator[]( a_index ).as_value().as< XValType >() : a_default;
144 return std::unique_ptr< param_array >(
new param_array( *
this ) );
149 return std::unique_ptr< param_array >(
new param_array( std::move( *
this ) ) );
164 return f_contents.size();
168 return f_contents.empty();
173 return a_index < size() ? operator[]( a_index ).to_string() : a_default;
178 return get_value( a_index, std::string( a_default ) );
183 return *f_contents.at( a_index );
187 return *f_contents.at( a_index );
192 return *f_contents.front();
196 return *f_contents.front();
201 return *f_contents.back();
205 return *f_contents.back();
212 f_contents.at( a_index ) = a_value.
clone();
219 f_contents.at( a_index ) = a_value.move_clone();
226 f_contents.at( a_index ) = std::move(a_value_ptr);
230 template< typename T, typename std::enable_if< std::is_convertible< T, param_value >::value, T >
::type* >
240 f_contents.push_back( a_value.
clone() );
245 f_contents.push_back( a_value.move_clone() );
250 f_contents.push_back( std::move(a_value_ptr) );
253 template< typename T, typename std::enable_if< std::is_convertible< T, param_value >::value, T >
::type* >
262 f_contents.push_front( a_value.
clone() );
267 f_contents.push_front( a_value.move_clone() );
272 f_contents.push_front( std::move(a_value_ptr) );
275 template< typename T, typename std::enable_if< std::is_convertible< T, param_value >::value, T >
::type* >
293 f_contents.at( a_index ).reset();
298 param_ptr_t t_current( std::move( f_contents.at( a_index ) ) );
309 return iterator( f_contents.begin() );
318 return iterator( f_contents.end() );
327 return f_contents.rbegin();
331 return f_contents.rbegin();
336 return f_contents.rend();
340 return f_contents.crend();
virtual bool is_null() const
std::deque< std::unique_ptr< param > > param_array_contents
virtual param_ptr_t clone() const
boost::indirect_iterator< param_array_contents::iterator, param > param_array_iterator
param_array_iterator iterator
void push_front(const param &a_value)
boost::indirect_iterator< param_array_contents::const_iterator, const param > param_array_const_iterator
virtual param_ptr_t move_clone()
const param & back() const
contents::const_reverse_iterator const_reverse_iterator
const param & operator[](unsigned a_index) const
virtual bool is_array() const
void append(const param_array &an_array)
param_array_contents contents
param_ptr_t remove(unsigned a_index)
std::string get_value(unsigned a_index, const std::string &a_default) const
reverse_iterator rbegin()
SCARAB_API std::ostream & operator<<(std::ostream &out, const param_array &a_value)
std::unique_ptr< param > param_ptr_t
void erase(unsigned a_index)
void assign(unsigned a_index, const param &a_value)
contents::reverse_iterator reverse_iterator
param_array_const_iterator const_iterator
void push_back(const param &a_value)
virtual param_ptr_t clone() const
const param & front() const
contents::value_type contents_type
auto to_string(T &&value) -> decltype(std::forward< T >(value))
Convert an object to a string (directly forward if this can become a string)