53 for (AnyMap::const_iterator i = _map.
begin(); i != _map.
end(); ++i) {
54 if (i->second->back().type() ==
typeid(
Ptr)) {
56 i->second->
begin(); j != i->second->end(); ++j) {
57 Ptr p = boost::any_cast<
Ptr>(*j);
59 n->add(i->first,
Ptr());
61 n->add(i->first, p->deepCopy());
67 n->_map[i->first] = vp;
75 for (AnyMap::const_iterator i = _map.
begin(); i != _map.
end(); ++i) {
77 if (!topLevelOnly && i->second->back().type() ==
typeid(
Ptr)) {
78 Ptr p = boost::any_cast<
Ptr>(i->second->back());
80 n += p->nameCount(
false);
89 for (AnyMap::const_iterator i = _map.
begin(); i != _map.
end(); ++i) {
91 if (!topLevelOnly && i->second->back().type() ==
typeid(
Ptr)) {
92 Ptr p = boost::any_cast<
Ptr>(i->second->back());
108 for (AnyMap::const_iterator i = _map.
begin(); i != _map.
end(); ++i) {
109 if (i->second->back().type() ==
typeid(
Ptr)) {
110 Ptr p = boost::any_cast<
Ptr>(i->second->back());
111 if (p.
get() != 0 && !topLevelOnly) {
128 for (AnyMap::const_iterator i = _map.
begin(); i != _map.
end(); ++i) {
129 if (i->second->back().type() ==
typeid(
Ptr)) {
131 Ptr p = boost::any_cast<
Ptr>(i->second->back());
132 if (p.
get() != 0 && !topLevelOnly) {
145 return _find(name) != _map.
end();
149 AnyMap::const_iterator i = _find(name);
150 return i != _map.
end() && i->second->size() > 1U;
154 AnyMap::const_iterator i = _find(name);
155 return i != _map.
end() && i->second->back().type() ==
typeid(
Ptr);
159 AnyMap::const_iterator i = _find(name);
160 if (i == _map.
end())
return 0;
161 return i->second->size();
165 AnyMap::const_iterator i = _find(name);
166 if (i == _map.
end()) {
169 return i->second->back().type();
174 template <
typename T>
176 AnyMap::const_iterator i = _find(name);
177 if (i == _map.
end()) {
181 return boost::any_cast<T>(i->second->back());
183 catch (boost::bad_any_cast) {
187 return boost::any_cast<T>(i->second->back());
190 template <
typename T>
192 AnyMap::const_iterator i = _find(name);
193 if (i == _map.
end()) {
197 return boost::any_cast<T>(i->second->back());
199 catch (boost::bad_any_cast) {
203 return boost::any_cast<T>(i->second->back());
206 template <
typename T>
208 AnyMap::const_iterator i = _find(name);
209 if (i == _map.
end()) {
214 j != i->second->end(); ++j) {
218 catch (boost::bad_any_cast) {
228 return get<bool>(name);
232 AnyMap::const_iterator i = _find(name);
233 if (i == _map.
end()) {
236 boost::any v = i->second->back();
238 if (t ==
typeid(
bool)) {
239 return boost::any_cast<
bool>(v);
240 }
else if (t ==
typeid(
char)) {
241 return boost::any_cast<
char>(v);
242 }
else if (t ==
typeid(
signed char)) {
243 return boost::any_cast<
signed char>(v);
244 }
else if (t ==
typeid(
unsigned char)) {
245 return boost::any_cast<
unsigned char>(v);
246 }
else if (t ==
typeid(
short)) {
247 return boost::any_cast<
short>(v);
248 }
else if (t ==
typeid(
unsigned short)) {
249 return boost::any_cast<
unsigned short>(v);
252 return boost::any_cast<
int>(v);
254 catch (boost::bad_any_cast) {
258 return boost::any_cast<
int>(v);
262 AnyMap::const_iterator i = _find(name);
263 if (i == _map.
end()) {
266 boost::any v = i->second->back();
268 if (t ==
typeid(
bool))
return boost::any_cast<
bool>(v);
269 if (t ==
typeid(
char))
return boost::any_cast<char>(v);
270 if (t ==
typeid(
signed char))
return boost::any_cast<signed char>(v);
271 if (t ==
typeid(
unsigned char))
return boost::any_cast<unsigned char>(v);
272 if (t ==
typeid(
short))
return boost::any_cast<short>(v);
273 if (t ==
typeid(
unsigned short))
return boost::any_cast<unsigned short>(v);
274 if (t ==
typeid(
int))
return boost::any_cast<int>(v);
275 if (t ==
typeid(
unsigned int))
return boost::any_cast<unsigned int>(v);
276 if (t ==
typeid(
long))
return boost::any_cast<long>(v);
277 if (t ==
typeid(
long long))
return boost::any_cast<long long>(v);
279 return boost::any_cast<
int64_t>(v);
281 catch (boost::bad_any_cast) {
285 return boost::any_cast<
int64_t>(v);
289 AnyMap::const_iterator i = _find(name);
290 if (i == _map.
end()) {
293 boost::any v = i->second->back();
295 if (t ==
typeid(
bool))
return boost::any_cast<
bool>(v);
296 if (t ==
typeid(
char))
return boost::any_cast<char>(v);
297 if (t ==
typeid(
signed char))
return boost::any_cast<signed char>(v);
298 if (t ==
typeid(
unsigned char))
return boost::any_cast<unsigned char>(v);
299 if (t ==
typeid(
short))
return boost::any_cast<short>(v);
300 if (t ==
typeid(
unsigned short))
return boost::any_cast<unsigned short>(v);
301 if (t ==
typeid(
int))
return boost::any_cast<int>(v);
302 if (t ==
typeid(
unsigned int))
return boost::any_cast<unsigned int>(v);
303 if (t ==
typeid(
long))
return boost::any_cast<long>(v);
304 if (t ==
typeid(
unsigned long))
return boost::any_cast<unsigned long>(v);
305 if (t ==
typeid(
long long))
return boost::any_cast<long long>(v);
306 if (t ==
typeid(
unsigned long long))
return boost::any_cast<unsigned long long>(v);
307 if (t ==
typeid(
float))
return boost::any_cast<float>(v);
309 return boost::any_cast<
double>(v);
311 catch (boost::bad_any_cast) {
315 return boost::any_cast<
double>(v);
319 return get<string>(name);
324 return get<Ptr>(name);
329 return get<Persistable::Ptr>(name);
340 if (t ==
typeid(
Ptr)) {
341 s << indent << *i <<
" = ";
345 Ptr p = boost::any_cast<
Ptr>(vp->back());
350 s << p->toString(
false, indent +
"..");
366 AnyMap::const_iterator j = _map.
find(name);
367 s << j->first <<
" = ";
369 if (vp->size() > 1) {
374 k != vp->end(); ++k) {
375 if (k != vp->begin()) {
378 boost::any
const& v(*k);
379 if (t ==
typeid(
bool)) {
380 s << boost::any_cast<bool>(v);
381 }
else if (t ==
typeid(
char)) {
382 s << '\'' << boost::any_cast<char>(v) <<
'\'';
383 }
else if (t ==
typeid(
signed char)) {
384 s << '\'' << boost::any_cast<signed char>(v) <<
'\'';
385 }
else if (t ==
typeid(
unsigned char)) {
386 s << '\'' << boost::any_cast<unsigned char>(v) <<
'\'';
387 }
else if (t ==
typeid(
short)) {
388 s << boost::any_cast<short>(v);
389 }
else if (t ==
typeid(
unsigned short)) {
390 s << boost::any_cast<unsigned short>(v);
391 }
else if (t ==
typeid(
int)) {
392 s << boost::any_cast<int>(v);
393 }
else if (t ==
typeid(
unsigned int)) {
394 s << boost::any_cast<unsigned int>(v);
395 }
else if (t ==
typeid(
long)) {
396 s << boost::any_cast<long>(v);
397 }
else if (t ==
typeid(
unsigned long)) {
398 s << boost::any_cast<unsigned long>(v);
399 }
else if (t ==
typeid(
long long)) {
400 s << boost::any_cast<long long>(v);
401 }
else if (t ==
typeid(
unsigned long long)) {
402 s << boost::any_cast<unsigned long long>(v);
403 }
else if (t ==
typeid(
float)) {
404 s << std::setprecision(7) << boost::any_cast<float>(v);
405 }
else if (t ==
typeid(
double)) {
406 s << std::setprecision(14) << boost::any_cast<double>(v);
407 }
else if (t ==
typeid(
string)) {
408 s <<
'"' << boost::any_cast<
string>(v) <<
'"';
411 }
else if (t ==
typeid(
Ptr)) {
414 s <<
"<Persistable>";
419 if (j->second->size() > 1) {
430 template <
typename T>
433 vp->push_back(value);
437 template <
typename T>
440 if (value.
empty())
return;
442 vp->insert(vp->end(), value.
begin(), value.
end());
450 template <
typename T>
452 AnyMap::iterator i = _find(name);
453 if (i == _map.
end()) {
457 if (i->second->back().type() !=
typeid(T)) {
459 name +
" has mismatched type");
461 i->second->push_back(value);
466 template <>
void dafBase::PropertySet::add<dafBase::PropertySet::Ptr>(
468 AnyMap::iterator i = _find(name);
469 if (i == _map.
end()) {
473 if (i->second->back().type() !=
typeid(
Ptr)) {
475 name +
" has mismatched type");
477 _cycleCheckPtr(value, name);
478 i->second->push_back(value);
482 template <
typename T>
485 AnyMap::iterator i = _find(name);
486 if (i == _map.
end()) {
490 if (i->second->back().type() !=
typeid(T)) {
492 name +
" has mismatched type");
494 i->second->insert(i->second->end(), value.
begin(), value.
end());
499 template<>
void dafBase::PropertySet::add<dafBase::PropertySet::Ptr>(
501 AnyMap::iterator i = _find(name);
502 if (i == _map.
end()) {
506 if (i->second->back().type() !=
typeid(
Ptr)) {
508 name +
" has mismatched type");
510 _cycleCheckPtrVec(value, name);
511 i->second->insert(i->second->end(), value.begin(), value.end());
516 add(name,
string(value));
522 if (source.
get() == 0) {
526 AnyMap::const_iterator sj = source->_find(name);
527 if (sj == source->_map.end()) {
529 name +
" not in source");
533 auto vp = std::make_shared<vector<boost::any>>();
534 vp->push_back(sj->second->back());
537 auto vp = std::make_shared<vector<boost::any>>(*(sj->second));
543 if (source.
get() == 0) {
548 i != names.
end(); ++i) {
549 AnyMap::const_iterator sp = source->_find(*i);
550 _add(*i, sp->second);
555 string::size_type i = name.
find(
'.');
556 if (_flat || i == name.npos) {
560 string prefix(name, 0, i);
561 AnyMap::iterator j = _map.
find(prefix);
562 if (j == _map.
end() || j->second->back().type() !=
typeid(
Ptr)) {
565 Ptr p = boost::any_cast<
Ptr>(j->second->back());
567 string suffix(name, i + 1);
576 dafBase::PropertySet::AnyMap::iterator
577 dafBase::PropertySet::_find(
std::string const& name) {
578 string::size_type i = name.
find(
'.');
579 if (_flat || i == name.npos) {
580 return _map.
find(name);
582 string prefix(name, 0, i);
583 AnyMap::iterator j = _map.
find(prefix);
584 if (j == _map.
end() || j->second->back().type() !=
typeid(
Ptr)) {
587 Ptr p = boost::any_cast<
Ptr>(j->second->back());
591 string suffix(name, i + 1);
592 AnyMap::iterator x = p->_find(suffix);
593 if (x == p->_map.end()) {
599 dafBase::PropertySet::AnyMap::const_iterator
600 dafBase::PropertySet::_find(
std::string const& name)
const {
601 string::size_type i = name.
find(
'.');
602 if (_flat || i == name.npos) {
603 return _map.
find(name);
605 string prefix(name, 0, i);
606 AnyMap::const_iterator j = _map.
find(prefix);
607 if (j == _map.
end() || j->second->back().type() !=
typeid(
Ptr)) {
610 Ptr p = boost::any_cast<
Ptr>(j->second->back());
614 string suffix(name, i + 1);
615 AnyMap::const_iterator x = p->_find(suffix);
616 if (x == p->_map.end()) {
624 _findOrInsert(name, vp);
630 AnyMap::const_iterator dp = _find(name);
631 if (dp == _map.
end()) {
635 if (vp->back().type() != dp->second->back().type()) {
637 name +
" has mismatched type");
640 if (vp->back().type() ==
typeid(
Ptr)) {
641 _cycleCheckAnyVec(*vp, name);
643 dp->second->insert(dp->second->end(), vp->begin(), vp->end());
647 void dafBase::PropertySet::_findOrInsert(
649 if (vp->back().type() ==
typeid(
Ptr)) {
651 Ptr source = boost::any_cast<
Ptr>(vp->back());
654 i != names.end(); ++i) {
655 AnyMap::const_iterator sp = source->_find(*i);
656 _add(name +
"." + *i, sp->second);
662 _cycleCheckAnyVec(*vp, name);
665 string::size_type i = name.
find(
'.');
666 if (_flat || i == name.npos) {
670 string prefix(name, 0, i);
671 string suffix(name, i + 1);
672 AnyMap::iterator j = _map.
find(prefix);
673 if (j == _map.
end()) {
675 pp->_findOrInsert(suffix, vp);
681 else if (j->second->back().type() !=
typeid(
Ptr)) {
684 " exists but does not contain PropertySet::Ptrs");
686 Ptr p = boost::any_cast<
Ptr>(j->second->back());
690 " exists but contains null PropertySet::Ptr");
692 p->_findOrInsert(suffix, vp);
698 _cycleCheckPtr(*i, name);
705 _cycleCheckPtr(boost::any_cast<Ptr>(*i), name);
709 void dafBase::PropertySet::_cycleCheckPtr(
Ptr const& v,
711 if (v.
get() ==
this) {
713 name +
" would cause a cycle");
717 i != sets.
end(); ++i) {
718 if (v->getAsPropertySetPtr(*i).
get() ==
this) {
720 name +
" would cause a cycle");
732 #define INSTANTIATE(t) \ 733 template t dafBase::PropertySet::get<t>(string const& name) const; \ 734 template t dafBase::PropertySet::get<t>(string const& name, t const& defaultValue) const; \ 735 template vector<t> dafBase::PropertySet::getArray<t>(string const& name) const; \ 736 template void dafBase::PropertySet::set<t>(string const& name, t const& value); \ 737 template void dafBase::PropertySet::set<t>(string const& name, vector<t> const& value); \ 738 template void dafBase::PropertySet::add<t>(string const& name, t const& value); \ 739 template void dafBase::PropertySet::add<t>(string const& name, vector<t> const& value); 743 INSTANTIATE(
signed char)
744 INSTANTIATE(
unsigned char)
746 INSTANTIATE(
unsigned short)
748 INSTANTIATE(
unsigned int)
750 INSTANTIATE(
unsigned long)
751 INSTANTIATE(
long long)
752 INSTANTIATE(
unsigned long long)
760 double getAsDouble(std::string const &name) const
Get the last value for any arithmetic property name (possibly hierarchical).
virtual Ptr deepCopy(void) const
Make a deep copy of the PropertySet and all of its contents.
virtual std::string _format(std::string const &name) const
std::shared_ptr< PropertySet > Ptr
Class for handling dates/times, including MJD, UTC, and TAI.
size_t valueCount(std::string const &name) const
Get the number of values for a property name (possibly hierarchical).
std::vector< T > getArray(std::string const &name) const
Get the vector of values for a property name (possibly hierarchical).
virtual void remove(std::string const &name)
Remove all values for a property name (possibly hierarchical).
virtual void _add(std::string const &name, std::shared_ptr< std::vector< boost::any > > vp)
T get(std::string const &name) const
Get the last value for a property name (possibly hierarchical).
bool getAsBool(std::string const &name) const
Get the last value for a bool property name (possibly hierarchical).
std::vector< std::string > paramNames(bool topLevelOnly=true) const
A variant of names that excludes the names of subproperties.
int getAsInt(std::string const &name) const
Get the last value for a bool/char/short/int property name (possibly hierarchical).
PropertySet::Ptr getAsPropertySetPtr(std::string const &name) const
Get the last value for a subproperty name (possibly hierarchical).
bool isPropertySetPtr(std::string const &name) const
Determine if a name (possibly hierarchical) is a subproperty.
PropertySet(bool flat=false)
Construct an empty PropertySet.
virtual std::string toString(bool topLevelOnly=false, std::string const &indent="") const
Generate a string representation of the PropertySet.
void set(std::string const &name, T const &value)
Replace all values for a property name (possibly hierarchical) with a new scalar value.
bool isArray(std::string const &name) const
Determine if a name (possibly hierarchical) has multiple values.
virtual void copy(std::string const &dest, ConstPtr source, std::string const &name, bool asScalar=false)
Replace a single value vector in the destination with one from the source.
virtual void combine(ConstPtr source)
Append all value vectors from the source to their corresponding properties.
int64_t getAsInt64(std::string const &name) const
Get the last value for a bool/char/short/int/int64_t property name (possibly hierarchical).
std::vector< std::string > names(bool topLevelOnly=true) const
Get the names in the PropertySet, optionally including those in subproperties.
size_t nameCount(bool topLevelOnly=true) const
Get the number of names in the PropertySet, optionally including those in subproperties.
bool exists(std::string const &name) const
Determine if a name (possibly hierarchical) exists.
Interface for DateTime class.
std::vector< std::string > propertySetNames(bool topLevelOnly=true) const
A variant of names that only returns the names of subproperties.
#define LSST_EXCEPT(type,...)
virtual void _set(std::string const &name, std::shared_ptr< std::vector< boost::any > > vp)
Class for storing generic metadata.
std::shared_ptr< Persistable > Ptr
virtual ~PropertySet(void)
Destructor.
std::string getAsString(std::string const &name) const
Get the last value for a string property name (possibly hierarchical).
Citizen is a class that should be among all LSST classes base classes, and handles basic memory manag...
Persistable::Ptr getAsPersistablePtr(std::string const &name) const
Get the last value for a Persistable name (possibly hierarchical).
void add(std::string const &name, T const &value)
Append a single value to the vector of values for a property name (possibly hierarchical).
std::type_info const & typeOf(std::string const &name) const
Get the type of values for a property name (possibly hierarchical).