LSST Applications g180d380827+0f66a164bb,g2079a07aa2+86d27d4dc4,g2305ad1205+7d304bc7a0,g29320951ab+500695df56,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g33d1c0ed96+0e5473021a,g3a166c0a6a+0e5473021a,g3ddfee87b4+e42ea45bea,g48712c4677+36a86eeaa5,g487adcacf7+2dd8f347ac,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+c70619cc9d,g5a732f18d5+53520f316c,g5ea96fc03c+341ea1ce94,g64a986408d+f7cd9c7162,g858d7b2824+f7cd9c7162,g8a8a8dda67+585e252eca,g99cad8db69+469ab8c039,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,gb0e22166c9+60f28cb32d,gba4ed39666+c2a2e4ac27,gbb8dafda3b+c92fc63c7e,gbd866b1f37+f7cd9c7162,gc120e1dc64+02c66aa596,gc28159a63d+0e5473021a,gc3e9b769f7+b0068a2d9f,gcf0d15dbbd+e42ea45bea,gdaeeff99f8+f9a426f77a,ge6526c86ff+84383d05b3,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gff1a9f87cc+f7cd9c7162,w.2024.17
LSST Data Management Base Package
Loading...
Searching...
No Matches
BaseRecord.h
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2#ifndef AFW_TABLE_BaseRecord_h_INCLUDED
3#define AFW_TABLE_BaseRecord_h_INCLUDED
4
5#include <iosfwd>
6
7#include "lsst/base.h"
12
13namespace lsst {
14namespace afw {
15namespace table {
16
32protected:
33
34 // Protected class whose instances must be passed to the public
35 // constructor, providing more fine-grained access control than a
36 // protected constructor would. In particular, this allows make_shared to
37 // be used.
39 private:
40 friend class BaseTable;
41
42 // A private ctor for this class (and friendship) is necessary to
43 // prevent e.g. BaseRecord({}, ...) calls from code without access
44 // to ConstructionToken.
45 explicit ConstructionToken(int) noexcept {}
46 };
47
48public:
49
58 BaseRecord(ConstructionToken const &, detail::RecordData && data);
59 // No copying
60 BaseRecord(const BaseRecord&) = delete;
61 BaseRecord& operator=(const BaseRecord&) = delete;
62
63 // No moving
66
69
72
75
78
80 Schema getSchema() const { return _table->getSchema(); }
81
83 std::shared_ptr<BaseTable const> getTable() const { return _table; }
84
92 template <typename T>
93 typename Field<T>::Element* getElement(Key<T> const& key) {
94 if (!key.isValid()) {
95 throw LSST_EXCEPT(
97 "Key is not valid (if this is a SourceRecord, make sure slot aliases have been set up).");
98 }
99 return reinterpret_cast<typename Field<T>::Element*>(reinterpret_cast<char*>(_data) +
100 key.getOffset());
101 }
102
110 template <typename T>
111 typename Field<T>::Element const* getElement(Key<T> const& key) const {
112 if (!key.isValid()) {
113 throw LSST_EXCEPT(
115 "Key is not valid (if this is a SourceRecord, make sure slot aliases have been set up).");
116 }
117 return reinterpret_cast<typename Field<T>::Element const*>(reinterpret_cast<char const*>(_data) +
118 key.getOffset());
119 }
120
128 template <typename T>
129 typename Field<T>::Reference operator[](Key<T> const& key) {
130 return key.getReference(getElement(key), _manager);
131 }
132
140 template <typename T>
141 typename Field<T>::ConstReference operator[](Key<T> const& key) const {
142 return key.getConstReference(getElement(key), _manager);
143 }
144
150 template <typename T>
151 typename Field<T>::Value get(Key<T> const& key) const {
152 return key.getValue(getElement(key), _manager);
153 }
154
163 template <typename T, typename U>
164 void set(Key<T> const& key, U const& value) {
165 key.setValue(getElement(key), _manager, value);
166 }
167
171 template <typename T>
172 T get(OutputFunctorKey<T> const& key) const {
173 return key.get(*this);
174 }
175
179 template <typename T, typename U>
180 void set(InputFunctorKey<T> const& key, U const& value) {
181 return key.set(*this, value);
182 }
183
184 template <typename Ref>
186 return key.getReference(*this);
187 }
188
189 template <typename ConstRef>
191 return key.getConstReference(*this);
192 }
193
195 void assign(BaseRecord const& other);
196
198 void assign(BaseRecord const& other, SchemaMapper const& mapper);
199
200 ndarray::Manager::Ptr getManager() const { return _manager; }
201
202 virtual ~BaseRecord() { _table->_destroy(*this); }
203
205 friend std::ostream& operator<<(std::ostream& os, BaseRecord const& record);
206
207protected:
209 virtual void _assign(BaseRecord const& other) {}
210
213 virtual void _stream(std::ostream& os) const;
214
215
216private:
217 friend class BaseTable;
218 friend class BaseColumnView;
219
220 // All these are definitely private, not protected - we don't want derived classes mucking with them.
221 void* _data; // pointer to field data
222 std::shared_ptr<BaseTable> _table; // the associated table
223 ndarray::Manager::Ptr _manager; // shared manager for lifetime of _data (like shared_ptr with no pointer)
224};
225
226template <typename RecordT, typename ...Args>
228 return std::make_shared<RecordT>(BaseRecord::ConstructionToken(0), _makeNewRecordData(),
229 std::forward<Args>(args)...);
230}
231
232
233} // namespace table
234} // namespace afw
235} // namespace lsst
236
237#endif // !AFW_TABLE_BaseRecord_h_INCLUDED
char * data
Definition BaseRecord.cc:61
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
SchemaMapper * mapper
Basic LSST definitions.
Tag types used to declare specialized field types.
Definition misc.h:31
Column-wise view into a sequence of records that have been allocated contiguously.
Base class for all records.
Definition BaseRecord.h:31
Ref operator[](ReferenceFunctorKey< Ref > const &key)
Definition BaseRecord.h:185
Field< T >::Value get(Key< T > const &key) const
Return the value of a field for the given key.
Definition BaseRecord.h:151
Field< T >::Element * getElement(Key< T > const &key)
Return a pointer to the underlying elements of a field (non-const).
Definition BaseRecord.h:93
void assign(BaseRecord const &other)
Copy all field values from other to this, requiring that they have equal schemas.
ConstRef operator[](ConstReferenceFunctorKey< ConstRef > const &key) const
Definition BaseRecord.h:190
std::shared_ptr< BaseTable const > getTable() const
Return the table this record is associated with.
Definition BaseRecord.h:83
BaseRecord & operator=(BaseRecord &&)=delete
Field< T >::Reference operator[](Key< T > const &key)
Return a reference (or reference-like type) to the field's value.
Definition BaseRecord.h:129
BaseRecord & operator=(const BaseRecord &)=delete
BaseRecord(BaseRecord &&)=delete
Field< T >::Element const * getElement(Key< T > const &key) const
Return a pointer to the underlying elements of a field (const).
Definition BaseRecord.h:111
Schema getSchema() const
Return the Schema that holds this record's fields and keys.
Definition BaseRecord.h:80
ndarray::Manager::Ptr getManager() const
Definition BaseRecord.h:200
void set(InputFunctorKey< T > const &key, U const &value)
Set a calculated or aggregate field.
Definition BaseRecord.h:180
BaseRecord(const BaseRecord &)=delete
BaseRecord(ConstructionToken const &, detail::RecordData &&data)
Construct a record with uninitialized data.
void set(Key< T > const &key, U const &value)
Set value of a field for the given key.
Definition BaseRecord.h:164
T get(OutputFunctorKey< T > const &key) const
Compute a calculated or aggregate field.
Definition BaseRecord.h:172
virtual void _assign(BaseRecord const &other)
Called by assign() after transferring fields to allow subclass data members to be copied.
Definition BaseRecord.h:209
friend std::ostream & operator<<(std::ostream &os, BaseRecord const &record)
Write the record's content out, one field on each line.
virtual void _stream(std::ostream &os) const
Called by operator<<.
Field< T >::ConstReference operator[](Key< T > const &key) const
Return a const reference (or const-reference-like type) to the field's value.
Definition BaseRecord.h:141
Base class for all tables.
Definition BaseTable.h:61
std::shared_ptr< RecordT > constructRecord(Args &&... args)
Helper function that must be used by all _makeRecord overrides to actually construct records.
Definition BaseRecord.h:227
Defines the fields and offsets for a table.
Definition Schema.h:51
A mapping between the keys of two Schemas, used to copy data between them.
Reports errors in the logical structure of the program.
Definition Runtime.h:46
const T & ConstReference
the type returned by BaseRecord::operator[] (const)
Definition FieldBase.h:44
T & Reference
the type returned by BaseRecord::operator[] (non-const)
Definition FieldBase.h:43
T Value
the type returned by BaseRecord::get
Definition FieldBase.h:42
typename FieldBase< T >::Element Element
Type used to store field data in the table (a field may have multiple elements).
Definition Field.h:26
Helper struct that contains the information passed from BaseTable to BaseRecord at construction.
Definition BaseTable.h:32