LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
BaseColumnView.h
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 #ifndef AFW_TABLE_BaseColumnView_h_INCLUDED
3 #define AFW_TABLE_BaseColumnView_h_INCLUDED
4 
5 #include <cstdint>
6 
8 
9 namespace lsst {
10 namespace afw {
11 namespace table {
12 
13 namespace detail {
14 
16 struct FlagExtractor {
18  using result_type = bool;
19 
20  result_type operator()(argument_type element) const { return element & _mask; }
21 
22  explicit FlagExtractor(Key<Flag> const& key) : _mask(argument_type(1) << key.getBit()) {}
23 
24 private:
25  argument_type _mask;
26 };
27 
28 } // namespace detail
29 
30 class BaseTable;
31 
32 class BaseColumnView;
33 
43 public:
44  using SizeT = std::size_t;
45 
46  ndarray::Array<SizeT, 1, 1> getArray() const { return _array; }
47 
48  SizeT getBit(Key<Flag> const& key) const;
49  SizeT getBit(std::string const& name) const;
50 
51  SizeT getMask(Key<Flag> const& key) const { return SizeT(1) << getBit(key); }
52  SizeT getMask(std::string const& name) const { return SizeT(1) << getBit(name); }
53 
54  std::vector<SchemaItem<Flag> > const& getSchemaItems() const { return _items; }
55 
56 private:
57  friend class BaseColumnView;
58 
59  explicit BitsColumn(std::size_t size);
60 
61  ndarray::Array<SizeT, 1, 1> _array;
63 };
64 
84 public:
87 
89  Schema getSchema() const { return getTable()->getSchema(); }
90 
92  template <typename T>
93  ndarray::ArrayRef<T, 1> const operator[](Key<T> const& key) const;
94 
96  template <typename T>
97  ndarray::ArrayRef<T, 2, 1> const operator[](Key<Array<T> > const& key) const;
98 
106  ndarray::result_of::vectorize<detail::FlagExtractor, ndarray::Array<Field<Flag>::Element const, 1> >::type
107  operator[](Key<Flag> const& key) const;
108 
117  BitsColumn getBits(std::vector<Key<Flag> > const& keys) const;
118 
127  BitsColumn getAllBits() const;
128 
135  template <typename InputIterator>
136  static BaseColumnView make(std::shared_ptr<BaseTable> const& table, InputIterator first,
137  InputIterator last);
138 
146  template <typename InputIterator>
147  static bool isRangeContiguous(std::shared_ptr<BaseTable> const& table, InputIterator first,
148  InputIterator last);
149 
154 
156 
157 protected:
158  BaseColumnView(std::shared_ptr<BaseTable> const& table, std::size_t recordCount, void* buf,
159  ndarray::Manager::Ptr const& manager);
160 
161 private:
162  friend class BaseTable;
163 
164  struct Impl;
165 
166  std::shared_ptr<Impl> _impl;
167 };
168 
169 template <typename RecordT>
170 class ColumnViewT : public BaseColumnView {
171 public:
172  using Record = RecordT;
173  using Table = typename RecordT::Table;
174 
177  return std::static_pointer_cast<Table>(BaseColumnView::getTable());
178  }
179 
181  template <typename InputIterator>
182  static ColumnViewT make(std::shared_ptr<Table> const& table, InputIterator first, InputIterator last) {
183  return ColumnViewT(BaseColumnView::make(table, first, last));
184  }
185 
186  ColumnViewT(ColumnViewT const&) = default;
187  ColumnViewT(ColumnViewT&&) = default;
188  ColumnViewT& operator=(ColumnViewT const&) = default;
190  ~ColumnViewT() = default;
191 
192 protected:
193  explicit ColumnViewT(BaseColumnView const& base) : BaseColumnView(base) {}
194 };
195 
196 template <typename InputIterator>
198  InputIterator last) {
199  if (first == last) {
200  return BaseColumnView(table, 0, nullptr, ndarray::Manager::Ptr());
201  }
202  Schema schema = table->getSchema();
203  std::size_t recordSize = schema.getRecordSize();
204  std::size_t recordCount = 1;
205  void* buf = first->_data;
206  ndarray::Manager::Ptr manager = first->_manager;
207  char* expected = reinterpret_cast<char*>(buf) + recordSize;
208  for (++first; first != last; ++first, ++recordCount, expected += recordSize) {
209  if (first->_data != expected || first->_manager != manager) {
211  "Record data is not contiguous in memory.");
212  }
213  }
214  return BaseColumnView(table, recordCount, buf, manager);
215 }
216 
217 template <typename InputIterator>
219  InputIterator last) {
220  if (first == last) return true;
221  Schema schema = table->getSchema();
222  std::size_t recordSize = schema.getRecordSize();
223  std::size_t recordCount = 1;
224  void* buf = first->_data;
225  ndarray::Manager::Ptr manager = first->_manager;
226  char* expected = reinterpret_cast<char*>(buf) + recordSize;
227  for (++first; first != last; ++first, ++recordCount, expected += recordSize) {
228  if (first->_data != expected || first->_manager != manager) {
229  return false;
230  }
231  }
232  return true;
233 }
234 } // namespace table
235 } // namespace afw
236 } // namespace lsst
237 
238 #endif // !AFW_TABLE_BaseColumnView_h_INCLUDED
table::Key< std::string > name
Definition: Amplifier.cc:116
double element[2]
Definition: BaseTable.cc:90
table::Key< int > type
Definition: Detector.cc:163
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
table::Schema schema
Definition: python.h:134
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.
BaseColumnView & operator=(BaseColumnView const &)
BitsColumn getBits(std::vector< Key< Flag > > const &keys) const
Return an integer array with the given Flag fields repacked into individual bits.
Schema getSchema() const
Return the schema that defines the fields.
BaseColumnView & operator=(BaseColumnView &&)
BaseColumnView(BaseColumnView const &)
BaseColumnView(BaseColumnView &&)
static BaseColumnView make(std::shared_ptr< BaseTable > const &table, InputIterator first, InputIterator last)
Construct a BaseColumnView from an iterator range.
BitsColumn getAllBits() const
Return an integer array with all Flag fields repacked into individual bits.
std::shared_ptr< BaseTable > getTable() const
Return the table that owns the records.
static bool isRangeContiguous(std::shared_ptr< BaseTable > const &table, InputIterator first, InputIterator last)
Return true if the given record iterator range is continuous and the records all belong to the given ...
ndarray::ArrayRef< T, 1 > const operator[](Key< T > const &key) const
Return a 1-d array corresponding to a scalar field (or subfield).
Base class for all tables.
Definition: BaseTable.h:61
A packed representation of a collection of Flag field columns.
SizeT getMask(Key< Flag > const &key) const
ndarray::Array< SizeT, 1, 1 > getArray() const
SizeT getBit(Key< Flag > const &key) const
std::vector< SchemaItem< Flag > > const & getSchemaItems() const
SizeT getMask(std::string const &name) const
ColumnViewT & operator=(ColumnViewT &&)=default
typename RecordT::Table Table
std::shared_ptr< Table > getTable() const
Return the table that owns the records.
ColumnViewT(ColumnViewT const &)=default
ColumnViewT(ColumnViewT &&)=default
ColumnViewT(BaseColumnView const &base)
ColumnViewT & operator=(ColumnViewT const &)=default
static ColumnViewT make(std::shared_ptr< Table > const &table, InputIterator first, InputIterator last)
Construct a BaseColumnView from an iterator range.
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
Defines the fields and offsets for a table.
Definition: Schema.h:51
Reports errors that are due to events beyond the control of the program.
Definition: Runtime.h:104
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
A base class for image defects.
A description of a field in a table.
Definition: Field.h:24
Functor to compute a flag bit, used to create an ndarray expression template for flag columns.
result_type operator()(argument_type element) const
FlagExtractor(Key< Flag > const &key)