LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
SchemaImpl.h
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 #ifndef AFW_TABLE_DETAIL_SchemaImpl_h_INCLUDED
3 #define AFW_TABLE_DETAIL_SchemaImpl_h_INCLUDED
4 
5 #include <vector>
6 #include <algorithm>
7 #include <map>
8 #include <variant>
9 
10 namespace lsst {
11 namespace afw {
12 namespace table {
13 
14 class Schema;
15 class SubSchema;
16 
21 template <typename T>
22 struct SchemaItem final {
25 
26  SchemaItem(Key<T> const& key_, Field<T> const& field_) : key(key_), field(field_) {}
27 };
28 
29 namespace detail {
30 
31 class Access;
32 
45 class SchemaImpl {
46 private:
49  template <typename ...E>
50  static std::variant<SchemaItem<E>...> makeItemVariantType(TypeList<E...>);
51 public:
52  static int const VERSION = 3;
53 
55  using ItemVariant = decltype(makeItemVariantType(FieldTypes{}));
64 
66  std::size_t getRecordSize() const { return _recordSize; }
67 
69  std::size_t getFieldCount() const { return _names.size(); }
70 
72  std::size_t getFlagFieldCount() const { return _flags.size(); }
73 
75  std::size_t getNonFlagFieldCount() const { return _offsets.size(); }
76 
78  template <typename T>
79  SchemaItem<T> find(std::string const& name) const;
80 
82  template <typename T>
83  SchemaItem<T> find(Key<T> const& key) const;
84 
86  SchemaItem<Flag> find(Key<Flag> const& key) const;
87 
89  template <typename F>
90  decltype(auto) findAndApply(std::string const& name, F&& func) const {
91  auto iter = _names.find(name);
92  if (iter == _names.end()) {
94  (boost::format("Field with name '%s' not found") % name).str());
95  }
96  return std::visit(std::forward<F>(func), _items[iter->second]);
97  }
98 
100  std::set<std::string> getNames(bool topOnly) const;
101 
103  std::set<std::string> getNames(bool topOnly, std::string const& prefix) const;
104 
105  template <typename T>
106  int contains(SchemaItem<T> const& item, int flags) const;
107 
109  template <typename T>
110  Key<T> addField(Field<T> const& field, bool doReplace = false);
111 
113  Key<Flag> addField(Field<Flag> const& field, bool doReplace = false);
114 
116  template <typename T>
117  Key<Array<T> > addField(Field<Array<T> > const& field, bool doReplace = false);
118 
120  Key<std::string> addField(Field<std::string> const& field, bool doReplace = false);
121 
123  template <typename T>
124  void replaceField(Key<T> const& key, Field<T> const& field);
125 
133  ItemContainer const& getItems() const { return _items; }
134 
136  SchemaImpl() : _recordSize(0), _lastFlagField(0), _lastFlagBit(0), _items(), _initFlag(false) {}
137 
138 private:
139  friend class detail::Access;
140 
141  template <typename T>
142  Key<T> addFieldImpl(std::size_t elementSize, std::size_t elementCount, Field<T> const& field, bool doReplace);
143 
144  std::size_t _recordSize; // Size of a record in bytes.
145  std::size_t _lastFlagField; // Offset of the last flag field in bytes.
146  std::size_t _lastFlagBit; // Bit of the last flag field.
147  ItemContainer _items; // Vector of variants of SchemaItem<T>.
148  NameMap _names; // Field name to vector-index map.
149  OffsetMap _offsets; // Offset to vector-index map for regular fields.
150  FlagMap _flags; // Offset to vector-index map for flags.
151  bool _initFlag; // Indicates if record is valid
152 };
153 } // namespace detail
154 } // namespace table
155 } // namespace afw
156 } // namespace lsst
157 
158 #endif // !AFW_TABLE_DETAIL_SchemaImpl_h_INCLUDED
table::Key< std::string > name
Definition: Amplifier.cc:116
table::Key< int > field
Definition: ApCorrMap.cc:77
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
std::string prefix
Definition: SchemaMapper.cc:72
Tag types used to declare specialized field types.
Definition: misc.h:31
Key specialization for Flag.
Definition: Flag.h:94
A class used as a handle to a particular field in a table.
Definition: Key.h:53
A private implementation class to hide the messy details of Schema.
Definition: SchemaImpl.h:45
ItemContainer const & getItems() const
Return the vector of SchemaItem variants.
Definition: SchemaImpl.h:133
std::set< std::string > getNames(bool topOnly) const
Return a set of field names (used to implement Schema::getNames).
Definition: Schema.cc:251
SchemaImpl()
Default constructor.
Definition: SchemaImpl.h:136
Key< T > addField(Field< T > const &field, bool doReplace=false)
Add a field to the schema (used to implement Schema::addField).
Definition: Schema.cc:314
int contains(SchemaItem< T > const &item, int flags) const
Definition: Schema.cc:225
decltype(auto) findAndApply(std::string const &name, F &&func) const
Find an item by name and run the given functor on it.
Definition: SchemaImpl.h:90
std::size_t getRecordSize() const
The size of a record in bytes.
Definition: SchemaImpl.h:66
void replaceField(Key< T > const &key, Field< T > const &field)
Replace the Field in an existing SchemaItem without changing the Key.
Definition: Schema.cc:193
std::size_t getFlagFieldCount() const
The number of Flag fields.
Definition: SchemaImpl.h:72
std::size_t getNonFlagFieldCount() const
The number of non-Flag fields.
Definition: SchemaImpl.h:75
SchemaItem< T > find(std::string const &name) const
Find an item by name (used to implement Schema::find).
Definition: Schema.cc:92
std::size_t getFieldCount() const
The total number of fields.
Definition: SchemaImpl.h:69
decltype(makeItemVariantType(FieldTypes{})) ItemVariant
A Boost.Variant type that can hold any one of the allowed SchemaItem types.
Definition: SchemaImpl.h:55
Reports attempts to access elements using an invalid key.
Definition: Runtime.h:151
T end(T... args)
T find(T... args)
class[[deprecated("Removed with no replacement (but see lsst::afw::image::TransmissionCurve). Will be " "removed after v22.")]] FilterProperty final
Describe the properties of a Filter (e.g.
Definition: Filter.h:53
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
A base class for image defects.
STL namespace.
T size(T... args)
A description of a field in a table.
Definition: Field.h:24
A simple pair-like struct for mapping a Field (name and description) with a Key (used for actual data...
Definition: SchemaImpl.h:22
SchemaItem(Key< T > const &key_, Field< T > const &field_)
Definition: SchemaImpl.h:26