LSST Applications g0f08755f38+82efc23009,g12f32b3c4e+e7bdf1200e,g1653933729+a8ce1bb630,g1a0ca8cf93+50eff2b06f,g28da252d5a+52db39f6a5,g2bbee38e9b+37c5a29d61,g2bc492864f+37c5a29d61,g2cdde0e794+c05ff076ad,g3156d2b45e+41e33cbcdc,g347aa1857d+37c5a29d61,g35bb328faa+a8ce1bb630,g3a166c0a6a+37c5a29d61,g3e281a1b8c+fb992f5633,g414038480c+7f03dfc1b0,g41af890bb2+11b950c980,g5fbc88fb19+17cd334064,g6b1c1869cb+12dd639c9a,g781aacb6e4+a8ce1bb630,g80478fca09+72e9651da0,g82479be7b0+04c31367b4,g858d7b2824+82efc23009,g9125e01d80+a8ce1bb630,g9726552aa6+8047e3811d,ga5288a1d22+e532dc0a0b,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+37c5a29d61,gcf0d15dbbd+2acd6d4d48,gd7358e8bfb+778a810b6e,gda3e153d99+82efc23009,gda6a2b7d83+2acd6d4d48,gdaeeff99f8+1711a396fd,ge2409df99d+6b12de1076,ge79ae78c31+37c5a29d61,gf0baf85859+d0a5978c5a,gf3967379c6+4954f8c433,gfb92a5be7c+82efc23009,gfec2e1e490+2aaed99252,w.2024.46
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