8 #ifndef SCARAB_PARAM_NODE_HH_ 9 #define SCARAB_PARAM_NODE_HH_ 13 #include <boost/iterator/iterator_adaptor.hpp> 14 #include <boost/type_traits/is_convertible.hpp> 15 #include <boost/utility/enable_if.hpp> 24 template<
class x_key,
class x_value,
class x_iiterator >
25 class map_deref_iterator :
public boost::iterator_adaptor< map_deref_iterator< x_key, x_value, x_iiterator >, x_iiterator, x_value, boost::bidirectional_traversal_tag >
40 template<
class x_other_value,
class x_other_iiterator >
47 return this->base()->first;
51 friend class boost::iterator_core_access;
55 return *this->base()->second;
85 virtual bool is_null()
const;
86 virtual bool is_node()
const;
88 virtual bool has_subset(
const param& a_subset )
const;
90 unsigned size()
const;
93 bool has(
const std::string& a_name )
const;
94 unsigned count(
const std::string& a_name )
const;
98 std::string get_value(
const std::string& a_name )
const;
101 template<
typename XValType >
102 XValType get_value(
const std::string& a_name )
const;
106 std::string get_value(
const std::string& a_name,
const std::string& a_default )
const;
107 std::string get_value(
const std::string& a_name,
const char* a_default )
const;
110 template<
typename XValType >
111 XValType get_value(
const std::string& a_name, XValType a_default )
const;
115 const param& at(
const std::string& a_name )
const;
118 param& at(
const std::string& a_name );
122 const param_value& value_at(
const std::string& a_name )
const;
125 param_value& value_at(
const std::string& a_name );
129 const param_array& array_at(
const std::string& a_name )
const;
132 param_array& array_at(
const std::string& a_name );
136 const param_node& node_at(
const std::string& a_name )
const;
139 param_node& node_at(
const std::string& a_name );
143 const param& operator[](
const std::string& a_name )
const;
146 param& operator[](
const std::string& a_name );
149 bool add(
const std::string& a_name,
const param& a_value );
151 bool add(
const std::string& a_name,
param&& a_value );
153 bool add(
const std::string& a_name,
param_ptr_t a_value_ptr );
156 void replace(
const std::string& a_name,
const param& a_value );
158 void replace(
const std::string& a_name,
param&& a_value );
160 void replace(
const std::string& a_name,
param_ptr_t a_value_ptr );
167 void erase(
const std::string& a_name );
172 const_iterator begin()
const;
175 const_iterator end()
const;
185 template<
typename XValType >
188 return value_at( a_name ).get< XValType >();
191 template<
typename XValType >
194 return has( a_name ) ? value_at( a_name ).get< XValType >() : a_default;
200 return std::unique_ptr< param_node >(
new param_node( *
this ) );
205 return std::unique_ptr< param_node >(
new param_node( std::move(*
this) ) );
220 return f_contents.size();
224 return f_contents.empty();
229 return f_contents.count( a_name ) > 0;
234 return f_contents.count( a_name );
239 return value_at( a_name ).to_string();
244 return has( a_name ) ? value_at( a_name ).to_string() : a_default;
249 return get_value( a_name, std::string( a_default ) );
254 return *f_contents.at( a_name );
259 return *f_contents.at( a_name );
294 return *f_contents.at( a_name );
299 return *f_contents[ a_name ];
304 contents::iterator it = f_contents.find( a_name );
305 if( it == f_contents.end() )
315 contents::iterator it = f_contents.find( a_name );
316 if( it == f_contents.end() )
318 f_contents.insert(
contents_type( a_name, a_value.move_clone() ) );
326 contents::iterator it = f_contents.find( a_name );
327 if( it == f_contents.end() )
329 f_contents.insert(
contents_type( a_name, std::move(a_value_ptr) ) );
337 f_contents[ a_name ] = a_value.
clone();
343 f_contents[ a_name ] = a_value.move_clone();
349 f_contents[ a_name ] = std::move(a_value_ptr);
355 contents::iterator it = f_contents.find( a_name );
356 if( it != f_contents.end() )
358 f_contents.erase( it );
365 contents::iterator it = f_contents.find( a_name );
366 if( it != f_contents.end() )
369 f_contents.erase( it );
383 return iterator( f_contents.begin() );
393 return iterator( f_contents.end() );
void replace(const std::string &a_name, const param &a_value)
Creates a copy of a_value; overwrites if the key exits.
const param_node & node_at(const std::string &a_name) const
const param_value & value_at(const std::string &a_name) const
unsigned count(const std::string &a_name) const
void erase(const std::string &a_name)
const param_array & array_at(const std::string &a_name) const
virtual bool is_null() const
virtual param_ptr_t move_clone()
std::string type(const x_type &a_param)
std::map< std::string, std::unique_ptr< param > > param_node_contents
contents::value_type contents_type
map_deref_iterator(const map_deref_iterator< x_key, x_other_value, x_other_iiterator > &other, typename boost::enable_if< boost::is_convertible< x_other_value, x_value >, enabler >::type=enabler())
param_node_iterator iterator
virtual bool is_node() const
std::string get_value(const std::string &a_name) const
bool has(const std::string &a_name) const
const x_key & name() const
const param & at(const std::string &a_name) const
virtual param_ptr_t clone() const
const param & operator[](const std::string &a_name) const
param_node_const_iterator const_iterator
SCARAB_API std::ostream & operator<<(std::ostream &out, const param_array &a_value)
map_deref_iterator(const x_iiterator &other)
std::unique_ptr< param > param_ptr_t
std::string to_string(std::uint64_t x)
param_ptr_t remove(const std::string &a_name)
map_deref_iterator< std::string, param, param_node_contents::iterator > param_node_iterator
bool add(const std::string &a_name, const param &a_value)
Areates a copy of a_value.
param_node_contents contents
x_value & dereference() const
virtual param_ptr_t clone() const
map_deref_iterator< std::string, const param, param_node_contents::const_iterator > param_node_const_iterator