2 #ifndef AFW_TABLE_Catalog_h_INCLUDED 3 #define AFW_TABLE_Catalog_h_INCLUDED 8 #include "boost/iterator/iterator_adaptor.hpp" 9 #include "boost/iterator/transform_iterator.hpp" 37 template <
typename BaseT>
38 class CatalogIterator :
public boost::iterator_adaptor<CatalogIterator<BaseT>, BaseT,
39 typename BaseT::value_type::element_type> {
43 template <
typename OtherBaseT>
49 template <
typename RecordT>
54 template <
typename RecordT>
62 typename BaseT::value_type::element_type& dereference()
const {
return **this->
base(); }
96 template <
typename RecordT>
126 : _table(table), _internal() {}
141 template <
typename InputIterator>
143 : _table(table), _internal() {
144 insert(
end(), first, last, deep);
160 template <
typename OtherRecordT>
162 : _table(other.getTable()), _internal(other.begin().
base(), other.
end().
base()) {}
166 if (&other !=
this) {
167 _table = other._table;
168 _internal = other._internal;
181 if (size_type(mask.size()) != size()) {
184 (
boost::format(
"Mask array with %d elements applied to catalog with %d elements") %
185 mask.size() % size())
190 const_iterator catIter = begin();
191 for (; maskIter != mask.end(); ++maskIter, ++catIter) {
192 if (*maskIter) result.push_back(catIter);
222 size_type S = size();
223 size_type start, stop = 0;
240 start = (size_type)startd;
250 stop = (size_type)stopd;
254 }
else if (step < 0) {
262 if (((step > 0) && (start >= stop)) || ((step < 0) && ((
std::ptrdiff_t)start <= stopd))) {
280 N = (stop - start) / step + (((stop - start) % step) ? 1 : 0);
287 for (size_type i = start; i < stop; i +=
step) {
344 return io::FitsReader::apply<CatalogT>(filename, hdu, flags);
358 return io::FitsReader::apply<CatalogT>(manager, hdu, flags);
369 return io::FitsReader::apply<CatalogT>(fitsfile, flags);
381 "Cannot get a column view from a CatalogT<RecordT const> (as column views are always " 382 "non-const views).");
384 return ColumnView::make(_table, begin(),
end());
388 bool isContiguous()
const {
return ColumnView::isRangeContiguous(_table, begin(),
end()); }
396 iterator
begin() {
return iterator(_internal.begin()); }
397 iterator
end() {
return iterator(_internal.end()); }
398 const_iterator
begin()
const {
return const_iterator(_internal.begin()); }
399 const_iterator
end()
const {
return const_iterator(_internal.end()); }
400 const_iterator
cbegin()
const {
return begin(); }
405 bool empty()
const {
return _internal.empty(); }
408 size_type
size()
const {
return _internal.size(); }
411 size_type
max_size()
const {
return _internal.max_size(); }
420 size_type
capacity()
const {
return _internal.size() + _table->getBufferSize(); }
429 if (n <= _internal.size())
return;
430 _table->preallocate(n - _internal.size());
434 reference
operator[](size_type i)
const {
return *_internal[i]; }
437 reference
at(size_type i)
const {
return *_internal.at(i); }
440 reference
front()
const {
return *_internal.front(); }
443 reference
back()
const {
return *_internal.back(); }
456 template <
typename InputIterator>
457 void assign(InputIterator
first, InputIterator last,
bool deep =
false) {
459 insert(
end(), first, last, deep);
465 _internal.push_back(p);
474 _internal.push_back(r);
499 template <
typename InputIterator>
500 void insert(iterator pos, InputIterator
first, InputIterator last,
bool deep =
false) {
501 _maybeReserve(pos, first, last, deep,
504 while (first != last) {
505 pos = insert(pos, *first);
510 while (first != last) {
511 pos = insert(pos, first);
512 assert(pos !=
end());
520 template <
typename InputIterator>
524 "SchemaMapper's output schema does not match catalog's schema");
526 _maybeReserve(pos, first, last,
true,
528 while (first != last) {
529 pos = insert(pos, _table->copyRecord(*first, mapper));
536 iterator
insert(iterator pos, Record
const& r) {
538 return iterator(_internal.insert(pos.base(), p));
543 return iterator(_internal.insert(pos.base(), p));
547 iterator
erase(iterator pos) {
return iterator(_internal.erase(pos.base())); }
551 return iterator(_internal.erase(first.base(), last.base()));
556 _table.swap(
other._table);
557 _internal.swap(
other._internal);
564 template <
typename T>
572 template <
typename Compare>
573 bool isSorted(Compare cmp)
const;
576 template <
typename T>
577 void sort(
Key<T> const& key);
584 template <
typename Compare>
585 void sort(Compare cmp);
602 template <
typename T>
605 template <
typename T>
623 template <
typename T>
626 template <
typename T>
629 template <
typename T>
632 template <
typename T>
635 template <
typename T>
638 template <
typename T>
661 template <
typename InputIterator>
662 void _maybeReserve(iterator& pos, InputIterator
first, InputIterator last,
bool deep,
664 if (deep) _table->preallocate(last - first);
667 template <
typename InputIterator>
668 void _maybeReserve(iterator pos, InputIterator first, InputIterator last,
bool deep,
677 template <
typename RecordT,
typename T>
684 template <
typename RecordT,
typename Adaptee>
687 return adaptee(*a, *b);
693 template <
typename RecordT,
typename T>
704 template <
typename RecordT>
705 template <
typename Compare>
709 if (empty())
return true;
710 const_iterator last = this->begin();
711 const_iterator i = last;
713 for (; i != this->
end(); ++i) {
714 if (f(i, last))
return false;
720 template <
typename RecordT>
721 template <
typename Compare>
727 template <
typename RecordT>
728 template <
typename T>
734 template <
typename RecordT>
735 template <
typename T>
741 template <
typename RecordT>
742 template <
typename T>
747 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, iterator> SearchIter;
750 if (i.base() ==
end() || *i != value)
return end();
754 template <
typename RecordT>
755 template <
typename T>
760 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, const_iterator> SearchIter;
763 if (i.base() ==
end() || *i != value)
return end();
767 template <
typename RecordT>
768 template <
typename T>
773 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, iterator> SearchIter;
778 template <
typename RecordT>
779 template <
typename T>
784 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, const_iterator> SearchIter;
789 template <
typename RecordT>
790 template <
typename T>
795 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, iterator> SearchIter;
800 template <
typename RecordT>
801 template <
typename T>
806 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, const_iterator> SearchIter;
811 template <
typename RecordT>
812 template <
typename T>
817 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, iterator> SearchIter;
823 template <
typename RecordT>
824 template <
typename T>
829 typedef boost::transform_iterator<detail::KeyExtractionFunctor<RecordT, T>, const_iterator> SearchIter;
857 template <
typename RecordT,
typename Catalog,
typename T>
859 typename Catalog::const_iterator iter = catalog.find(value, key);
860 if (iter == catalog.end()) {
866 template <
typename Catalog,
typename T>
868 return catalog.lower_bound(value, key) - catalog.begin();
871 template <
typename Catalog,
typename T>
873 return catalog.upper_bound(value, key) - catalog.begin();
876 template <
typename Catalog,
typename T>
879 catalog.equal_range(value, key);
888 #endif // !AFW_TABLE_Catalog_h_INCLUDED
CatalogT(CatalogT< OtherRecordT > const &other)
Shallow copy constructor from a container containing a related record type.
void push_back(std::shared_ptr< RecordT > const &p)
Add the given record to the end of the catalog without copying.
Defines the fields and offsets for a table.
std::shared_ptr< RecordT > _Catalog_find(Catalog const &catalog, T const &value, Key< T > const &key)
iterator insert(iterator pos, std::shared_ptr< RecordT > const &p)
Insert the given record at the given position without copying.
Column-wise view into a sequence of records that have been allocated contiguously.
Internal::difference_type difference_type
CatalogT< RecordT > subset(ndarray::Array< bool const, 1 > const &mask) const
Return the subset of a catalog corresponding to the True values of the given mask array...
CatalogT & operator=(CatalogT const &other)
Shallow assigment.
CatalogIterator(CatalogIterator< OtherBaseT > const &other)
A custom container class for records, based on std::vector.
A mapping between the keys of two Schemas, used to copy data between them.
bool isSorted(Key< T > const &key) const
Return true if the catalog is in ascending order according to the given key.
std::shared_ptr< Table > getTable() const
Return the table associated with the catalog.
Reports attempts to exceed implementation-defined length limits for some classes. ...
Schema const getOutputSchema() const
Return the output schema (copy-on-write).
size_type max_size() const
Return the maximum number of elements allowed in a catalog.
void sort(Key< T > const &key)
Sort the catalog in-place by the field with the given key.
static CatalogT readFits(fits::MemFileManager &manager, int hdu=fits::DEFAULT_HDU, int flags=0)
Read a FITS binary table from a RAM file.
Internal & getInternal()
Return a reference to the internal vector-of-shared_ptr.
void swap(CatalogT &other) noexcept
Shallow swap of two catalogs.
reference back() const
Return the last record.
void pop_back()
Remove the last record in the catalog.
bool operator()(std::shared_ptr< RecordT > const &a, std::shared_ptr< RecordT > const &b) const
int _Catalog_lower_bound(Catalog const &catalog, T const &value, Key< T > const &key)
iterator lower_bound(typename Field< T >::Value const &value, Key< T > const &key)
Performed binary searches on sorted fields.
Schema getSchema() const
Return the schema associated with the catalog's table.
void insert(iterator pos, InputIterator first, InputIterator last, bool deep=false)
Insert an iterator range into the table.
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
CatalogT(std::shared_ptr< Table > const &table, InputIterator first, InputIterator last, bool deep=false)
Construct a catalog from a table and an iterator range.
std::pair< int, int > _Catalog_equal_range(Catalog const &catalog, T const &value, Key< T > const &key)
CatalogIterator & operator=(std::shared_ptr< RecordT > const &other) const
Internal const & getInternal() const
Return a reference to the internal vector-of-shared_ptr.
static CatalogT readFits(std::string const &filename, int hdu=fits::DEFAULT_HDU, int flags=0)
Read a FITS binary table from a regular file.
CatalogT(CatalogT const &other)
Shallow copy constructor.
FastFinder::Iterator Iterator
const_iterator cend() const
Iterator access.
int _Catalog_upper_bound(Catalog const &catalog, T const &value, Key< T > const &key)
CatalogT< RecordT > subset(std::ptrdiff_t startd, std::ptrdiff_t stopd, std::ptrdiff_t step) const
Returns a shallow copy of a subset of this Catalog.
void push_back(Record const &r)
Add a copy of the given record to the end of the catalog.
A base class for image defects.
void clear()
Remove all records from the catalog.
reference front() const
Return the first record.
Internal::size_type size_type
Lifetime-management for memory that goes into FITS memory files.
iterator end()
Iterator access.
CatalogT(Schema const &schema)
Construct a catalog from a schema, creating a table with Table::make(schema).
iterator erase(iterator pos)
Erase the record pointed to by pos, and return an iterator the next record.
Iterator class for CatalogT.
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
size_type capacity() const
Return the capacity of the catalog.
Record::ColumnView ColumnView
CatalogT(CatalogT &&other)
iterator erase(iterator first, iterator last)
Erase the records in the range [first, last).
CatalogIterator(BaseT const &base)
Reports errors in the logical structure of the program.
CatalogT(std::shared_ptr< Table > const &table=std::shared_ptr< Table >())
Construct a catalog from a table (or nothing).
bool empty() const
Return true if the catalog has no records.
void writeFits(fits::Fits &fitsfile, int flags=0) const
Write a FITS binary table to an open file object.
CatalogIterator< typename Internal::const_iterator > const_iterator
void writeFits(std::string const &filename, std::string const &mode="w", int flags=0) const
Write a FITS binary table to a regular file.
const_iterator begin() const
Iterator access.
void reserve(size_type n)
Increase the capacity of the catalog to the given size.
iterator insert(iterator pos, Record const &r)
Insert a copy of the given record at the given position.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
bool isContiguous() const
Return true if all records are contiguous.
void assign(InputIterator first, InputIterator last, bool deep=false)
Replace the contents of the table with an iterator range.
CatalogT & operator=(CatalogT &&other)
A class used as a handle to a particular field in a table.
T Value
the type returned by BaseRecord::get
const_iterator cbegin() const
Iterator access.
iterator find(typename Field< T >::Value const &value, Key< T > const &key)
Return an iterator to the record with the given value.
ColumnView getColumnView() const
Return a ColumnView of this catalog's records.
reference operator[](size_type i) const
Return the record at index i.
static void apply(OutputT &output, std::string const &mode, ContainerT const &container, int flags)
Driver for writing FITS files.
bool operator()(RecordT const &a, RecordT const &b) const
Reports invalid arguments.
void insert(SchemaMapper const &mapper, iterator pos, InputIterator first, InputIterator last)
Insert a range of records into the catalog by copying them with a SchemaMapper.
size_type size() const
Return the number of elements in the catalog.
ItemVariant const * other
const_iterator end() const
Iterator access.
iterator begin()
Iterator access.
std::pair< iterator, iterator > equal_range(typename Field< T >::Value const &value, Key< T > const &key)
Performed binary searches on sorted fields.
reference at(size_type i) const
Return the record at index i (throws std::out_of_range).
static CatalogT readFits(fits::Fits &fitsfile, int flags=0)
Read a FITS binary table from a file object already at the correct extension.
iterator upper_bound(typename Field< T >::Value const &value, Key< T > const &key)
Performed binary searches on sorted fields.
CatalogT copy() const
Deep-copy the catalog using a cloned table.
void writeFits(fits::MemFileManager &manager, std::string const &mode="w", int flags=0) const
Write a FITS binary table to a RAM file.
Base class for all tables.
CatalogIterator< typename Internal::iterator > iterator
std::shared_ptr< RecordT > pointer
const int DEFAULT_HDU
Specify that the default HDU should be read.
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
friend class boost::iterator_core_access