LSST Applications g042eb84c57+730a74494b,g04e9c324dd+8c5ae1fdc5,g134cb467dc+1f1e3e7524,g199a45376c+0ba108daf9,g1fd858c14a+fa7d31856b,g210f2d0738+f66ac109ec,g262e1987ae+83a3acc0e5,g29ae962dfc+d856a2cb1f,g2cef7863aa+aef1011c0b,g35bb328faa+8c5ae1fdc5,g3fd5ace14f+a1e0c9f713,g47891489e3+0d594cb711,g4d44eb3520+c57ec8f3ed,g4d7b6aa1c5+f66ac109ec,g53246c7159+8c5ae1fdc5,g56a1a4eaf3+fd7ad03fde,g64539dfbff+f66ac109ec,g67b6fd64d1+0d594cb711,g67fd3c3899+f66ac109ec,g6985122a63+0d594cb711,g74acd417e5+3098891321,g786e29fd12+668abc6043,g81db2e9a8d+98e2ab9f28,g87389fa792+8856018cbb,g89139ef638+0d594cb711,g8d7436a09f+80fda9ce03,g8ea07a8fe4+760ca7c3fc,g90f42f885a+033b1d468d,g97be763408+a8a29bda4b,g99822b682c+e3ec3c61f9,g9d5c6a246b+0d5dac0c3d,ga41d0fce20+9243b26dd2,gbf99507273+8c5ae1fdc5,gd7ef33dd92+0d594cb711,gdab6d2f7ff+3098891321,ge410e46f29+0d594cb711,geaed405ab2+c4bbc419c6,gf9a733ac38+8c5ae1fdc5,w.2025.38
LSST Data Management Base Package
Loading...
Searching...
No Matches
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
10namespace lsst {
11namespace afw {
12namespace table {
13
14class Schema;
15class SubSchema;
16
21template <typename T>
22struct SchemaItem final {
25
26 SchemaItem(Key<T> const& key_, Field<T> const& field_) : key(key_), field(field_) {}
27};
28
29namespace detail {
30
31class Access;
32
46private:
49 template <typename ...E>
50 static std::variant<SchemaItem<E>...> makeItemVariantType(TypeList<E...>);
51public:
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
138private:
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
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
Tag types used to declare specialized field types.
Definition misc.h:31
A class used as a handle to a particular field in a table.
Definition Key.h:53
Defines the fields and offsets for a table.
Definition Schema.h:51
A proxy type for name lookups in a Schema.
Definition Schema.h:367
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::map< std::string, std::size_t > NameMap
A map from field names to position in the vector, so we can do name lookups.
Definition SchemaImpl.h:59
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::map< std::pair< std::size_t, std::size_t >, std::size_t > FlagMap
A map from Flag field offset/bit pairs to position in the vector, so we can do Flag field lookups.
Definition SchemaImpl.h:63
ItemContainer const & getItems() const
Return the vector of SchemaItem variants.
Definition SchemaImpl.h:133
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
std::vector< ItemVariant > ItemContainer
A std::vector whose elements can be any of the allowed SchemaItem types.
Definition SchemaImpl.h:57
std::map< std::size_t, std::size_t > OffsetMap
A map from standard field offsets to position in the vector, so we can do field lookups.
Definition SchemaImpl.h:61
Reports attempts to access elements using an invalid key.
Definition Runtime.h:151
T forward(T... args)
TypeList< RecordId, std::uint16_t, std::int32_t, float, double, lsst::geom::Angle, std::uint8_t, Flag, std::string, Array< std::uint16_t >, Array< int >, Array< float >, Array< double >, Array< std::uint8_t > > FieldTypes
A compile-time list of all field types.
Definition types.h:53
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