lsst.daf.base g15c806e14d+57f5c03693
PropertySet.h
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2
3/*
4 * LSST Data Management System
5 * Copyright 2008, 2009, 2010 LSST Corporation.
6 *
7 * This product includes software developed by the
8 * LSST Project (http://www.lsst.org/).
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the LSST License Statement and
21 * the GNU General Public License along with this program. If not,
22 * see <http://www.lsstcorp.org/LegalNotices/>.
23 */
24
25#ifndef LSST_DAF_BASE_PROPERTYSET
26#define LSST_DAF_BASE_PROPERTYSET
27
46#include <memory>
47#include <string>
48#include <typeinfo>
49#include <unordered_map>
50#include <vector>
51#include <any>
52
53#include "lsst/base.h"
55#include "lsst/pex/exceptions.h"
56
57namespace lsst {
58namespace daf {
59namespace base {
60
61#if defined(__ICC)
62#pragma warning(push)
63#pragma warning(disable : 444)
64#endif
65
67public:
68 // Typedefs
71
77 explicit PropertySet(bool flat = false);
78
80 virtual ~PropertySet() noexcept;
81
82 // No copying
83 PropertySet(const PropertySet&) = delete;
84 PropertySet& operator=(const PropertySet&) = delete;
85
86 // No moving
88 PropertySet& operator=(PropertySet&&) = delete;
89
90 // Accessors
91
97 virtual Ptr deepCopy() const;
98
105 size_t nameCount(bool topLevelOnly = true) const;
106
114 std::vector<std::string> names(bool topLevelOnly = true) const;
115
119 std::vector<std::string> paramNames(bool topLevelOnly = true) const;
120
124 std::vector<std::string> propertySetNames(bool topLevelOnly = true) const;
125
132 bool exists(std::string const& name) const;
133
140 bool isArray(std::string const& name) const;
141
148 bool isPropertySetPtr(std::string const& name) const;
149
156 bool isUndefined(std::string const& name) const;
157
164 size_t valueCount() const;
165
172 size_t valueCount(std::string const& name) const;
173
183 std::type_info const& typeOf(std::string const& name) const;
184
188 // Implemented in the .cc file to work around symbol visiblity issues on macOS
189 // e.g. https://github.com/pybind/pybind11/issues/1503
190 template <typename T>
191 static std::type_info const& typeOfT();
192
193 // The following throw an exception if the type does not match exactly.
194
206 template <typename T>
207 T get(std::string const& name) const;
208
221 template <typename T>
222 T get(std::string const& name, T const& defaultValue) const;
223
235 template <typename T>
236 std::vector<T> getArray(std::string const& name) const;
237
238 // The following throw an exception if the conversion is inappropriate.
239
250 bool getAsBool(std::string const& name) const;
251
261 int getAsInt(std::string const& name) const;
262
274 int64_t getAsInt64(std::string const& name) const;
275
285 uint64_t getAsUInt64(std::string const& name) const;
286
296 double getAsDouble(std::string const& name) const;
297
309 std::string getAsString(std::string const& name) const;
310
319 PropertySet::Ptr getAsPropertySetPtr(std::string const& name) const;
320
329 Persistable::Ptr getAsPersistablePtr(std::string const& name) const;
330
340 virtual std::string toString(bool topLevelOnly = false, std::string const& indent = "") const;
341
342 // Modifiers
343
352 template <typename T>
353 void set(std::string const& name, T const& value);
354
363 template <typename T>
364 void set(std::string const& name, std::vector<T> const& value);
365
373 void set(std::string const& name, char const* value);
374
384 template <typename T>
385 void add(std::string const& name, T const& value);
386
398 template <typename T>
399 void add(std::string const& name, std::vector<T> const& value);
400
411 void add(std::string const& name, char const* value);
412
426 virtual void copy(std::string const& dest, ConstPtr source, std::string const& name,
427 bool asScalar = false);
428
442 virtual void combine(ConstPtr source);
443
450 virtual void remove(std::string const& name);
451
452protected:
453 /*
454 * Find the property name (possibly hierarchical) and set or replace its
455 * value with the given vector of values. Hook for subclass overrides of
456 * top-level setting.
457 *
458 * @param[in] name Property name to find, possibly hierarchical.
459 * @param[in] vp shared_ptr to vector of values.
460 * @throws InvalidParameterError Hierarchical name uses non-PropertySet.
461 */
462 virtual void _set(std::string const& name, std::shared_ptr<std::vector<std::any> > vp);
463
464 /*
465 * Find the property name (possibly hierarchical) and append or set its
466 * value with the given vector of values.
467 *
468 * @param[in] name Property name to find, possibly hierarchical.
469 * @param[in] vp shared_ptr to vector of values.
470 * @throws InvalidParameterError Hierarchical name uses non-PropertySet.
471 */
472 virtual void _add(std::string const& name, std::shared_ptr<std::vector<std::any> > vp);
473
474 // Format a value in human-readable form; called by toString
475 virtual std::string _format(std::string const& name) const;
476
477private:
478
479 typedef std::unordered_map<std::string, std::shared_ptr<std::vector<std::any> > > AnyMap;
480
481 /*
482 * Find the property name (possibly hierarchical).
483 *
484 * @param[in] name Property name to find, possibly hierarchical.
485 * @return unordered_map::iterator to the property or end() if nonexistent.
486 */
487 AnyMap::iterator _find(std::string const& name);
488
489 /*
490 * Find the property name (possibly hierarchical). Const version.
491 *
492 * @param[in] name Property name to find, possibly hierarchical.
493 * @return unordered_map::const_iterator to the property or end().
494 */
495 AnyMap::const_iterator _find(std::string const& name) const;
496
497 /*
498 * Find the property name (possibly hierarchical) and set or replace its
499 * value with the given vector of values.
500 *
501 * @param[in] name Property name to find, possibly hierarchical.
502 * @param[in] vp shared_ptr to vector of values.
503 * @throws InvalidParameterError Hierarchical name uses non-PropertySet.
504 */
505 virtual void _findOrInsert(std::string const& name, std::shared_ptr<std::vector<std::any> > vp);
506 void _cycleCheckPtrVec(std::vector<Ptr> const& v, std::string const& name);
507 void _cycleCheckAnyVec(std::vector<std::any> const& v, std::string const& name);
508 void _cycleCheckPtr(Ptr const& v, std::string const& name);
509
510 AnyMap _map;
511 bool _flat;
512};
513
514#if defined(__ICC)
515#pragma warning(pop)
516#endif
517
518template <>
519void PropertySet::add<PropertySet::Ptr>(std::string const& name, Ptr const& value);
520template <>
521void PropertySet::add<PropertySet::Ptr>(std::string const& name, std::vector<Ptr> const& value);
522}
523} // namespace daf
524} // namespace lsst
525
526#endif
Interface for Persistable base class.
#define LSST_EXPORT
Base class for all persistable classes.
Definition: Persistable.h:75
Class for storing generic metadata.
Definition: PropertySet.h:66
std::shared_ptr< PropertySet > Ptr
Definition: PropertySet.h:69
std::shared_ptr< PropertySet const > ConstPtr
Definition: PropertySet.h:70
PropertySet(bool flat=false)
Construct an empty PropertySet.
virtual ~PropertySet() noexcept
Destructor.
STL namespace.