1 #ifndef ANY_COLLECTION_H 2 #define ANY_COLLECTION_H 6 #include <KrisLibrary/errors.h> 30 bool operator == (
const AnyKeyable& rhs)
const;
38 struct hash<
AnyKeyable> :
public unary_function<AnyKeyable,size_t>
40 size_t operator()(
const AnyKeyable& key)
const {
return key.hash(); }
76 typedef std::shared_ptr<AnyCollection> AnyCollectionPtr;
82 template <
class T,
class T2>
84 template <
class T,
class T2>
93 bool collection()
const;
101 size_t depth()
const;
110 bool as(T& value)
const;
113 bool asvector(std::vector<T>& values)
const;
115 bool asvector(std::vector<AnyValue>& values)
const;
118 bool operator == (
const T& value)
const;
121 bool operator != (
const T& value)
const {
return !operator == (value); }
123 void resize(
size_t n);
127 AnyCollectionPtr find(
int i)
const;
128 AnyCollectionPtr find(
const char* str)
const;
130 AnyCollectionPtr insert(
int i);
131 AnyCollectionPtr insert(
const char* str);
159 AnyCollection& operator = (
const char* str) {
return operator = (std::string(str)); }
164 template <
class T,
class T2>
167 template <
class T,
class T2>
168 AnyCollection& operator = (
const UNORDERED_MAP_TEMPLATE<T,T2>& map);
175 AnyCollectionPtr lookup(
const std::string& reference,
bool insert=
false,
char delim=
'.',
char lbracket=
'[',
char rbracket=
']');
176 AnyCollectionPtr lookup(
const std::vector<std::string>& path,
bool insert=
false);
177 AnyCollectionPtr lookup(
const std::vector<AnyKeyable>& path,
bool insert=
false);
179 static bool parse_reference(
const std::string& reference,std::vector<std::string>& path,
char delim=
'.',
char lbracket=
'[',
char rbracket=
']');
183 bool match_path(
const std::vector<std::string>& path,std::vector<AnyKeyable>& key_path)
const;
189 AnyCollectionPtr slice(
const std::string& reference,
const char* delims=
".[]:,");
199 bool subcollection(
const std::vector<std::string>& paths,
AnyCollection& subset,
const char* delims=
".[]:,");
202 void enumerate(std::vector<AnyCollectionPtr >& collections)
const;
204 void enumerate_keys(std::vector<AnyKeyable>& elements)
const;
206 void enumerate_values(std::vector<AnyValue>& elements)
const;
208 void enumerate_keys_dfs(std::vector<std::vector<AnyKeyable> >& paths)
const;
210 void enumerate_values_dfs(std::vector<AnyValue>& elements)
const;
227 bool read(std::istream& in);
228 bool read(
const char* data);
230 void write(std::ostream& out,
int indent=0)
const;
232 void write_inline(std::ostream& out)
const;
235 enum Type { None, Value, Array, Map };
237 typedef std::vector<AnyCollectionPtr > ArrayType;
238 typedef UNORDERED_MAP_TEMPLATE<AnyKeyable,AnyCollectionPtr > MapType;
246 inline std::istream& operator >> (std::istream& in,
AnyCollection& c)
249 if(!res) in.setstate(std::ios::failbit);
254 inline std::ostream& operator << (std::ostream& out,
const AnyCollection& c)
261 AnyCollection::AnyCollection(
const std::vector<T>& array)
267 template <
class T,
class T2>
268 AnyCollection::AnyCollection(
const std::map<T,T2>& map)
274 template <
class T,
class T2>
275 AnyCollection::AnyCollection(
const UNORDERED_MAP_TEMPLATE<T,T2>& map)
283 AnyCollection::operator T()
const 288 FatalError(
"AnyCollection: coercion from %s to %s failed\n",value.type().name(),
typeid(T).name());
289 else if(type == None)
290 FatalError(
"AnyCollection: coersion to %s failed, item does not exist\n",
typeid(T).name());
292 FatalError(
"AnyCollection: coersion to %s failed, not of value type\n",
typeid(T).name());
298 bool AnyCollection::as(T& result)
const 301 bool res=CoerceCast<T>(value,result);
310 bool AnyCollection::operator == (
const T& v)
const 312 if(type != Value)
return false;
317 bool AnyCollection::asvector(std::vector<T>& values)
const 319 std::vector<AnyValue> anyvalues;
320 if(!asvector(anyvalues))
return false;
321 values.resize(anyvalues.size());
322 for(
size_t i=0;i<values.size();i++) {
323 bool res = CoerceCast<T>(anyvalues[i],values[i]);
325 LOG4CXX_INFO(KrisLibrary::logger(),
"Coerce cast "<<anyvalues[i].type().name()<<
" to "<<
typeid(T).name()<<
" failed for element "<<(
int)i);
337 array.resize(_array.size());
338 for(
size_t i=0;i<array.size();i++)
339 array[i] = std::make_shared<AnyCollection>(_array[i]);
343 template <
class T,
class T2>
347 for(
typename std::map<T,T2>::const_iterator i=_map.begin();i!=_map.end();i++)
348 map[i->first] = std::make_shared<AnyCollection>(i->second);
352 template <
class T,
class T2>
356 for(
typename UNORDERED_MAP_TEMPLATE<T,T2>::const_iterator i=_map.begin();i!=_map.end();i++)
357 map[i->first] = std::make_shared<AnyCollection>(i->second);
A flexible hierarchical collection of AnyValues, which can be easily initialized to contain primitive...
Definition: AnyCollection.h:73
A polymorphic container class that can contain data of any type.
Definition: AnyValue.h:25
void write(std::ostream &out, int indent=0) const
Writes in JSON format.
Definition: AnyCollection.cpp:1502
Any primitive value (bool, char, unsigned char, int, unsigned int, float, double, string) that we kno...
Definition: AnyCollection.h:16
The logging system used in KrisLibrary.
AnyCollection & operator=(const AnyCollection &rhs)
shallow copy
Definition: AnyCollection.cpp:1103
bool read(std::istream &in)
Reads in JSON format.
Definition: AnyCollection.cpp:1377