1 #ifndef DataFormats_Common_DetSetVectorNew_h 2 #define DataFormats_Common_DetSetVectorNew_h 8 #include <boost/iterator/transform_iterator.hpp> 48 namespace dstvdetails {
75 assert(rh.m_filling ==
false);
82 assert(rh.m_filling ==
false);
122 return offset.compare_exchange_strong(expected, -2);
134 bool expected =
false;
135 if (!
m_filling.compare_exchange_strong(expected,
true))
154 template <
typename T>
155 class DetSetVector :
private dstvdetails::DetSetVectorTrans {
171 typedef typename IdContainer::iterator
IdIter;
172 typedef typename std::vector<data_type>::iterator
DataIter;
194 typedef std::pair<const_iterator, const_iterator>
Range;
230 m_v.m_filling =
false;
239 if (
m_v.onDemand() &&
m_v.m_data.size() ==
m_v.m_data.capacity())
244 if (
m_v.onDemand() &&
m_v.m_data.size() +
s >
m_v.m_data.capacity())
259 m_v.m_dataSize =
m_v.m_data.size();
271 template <
typename... Args>
274 m_v.m_data.emplace_back(
args...);
281 m_v.m_data.push_back(
d);
297 friend class ::TestDetSet;
322 m_v.m_filling =
false;
327 bool expected =
false;
328 while (!
m_v.m_filling.compare_exchange_weak(expected,
true)) {
330 nanosleep(
nullptr,
nullptr);
333 if (
m_v.onDemand() &&
full()) {
334 m_v.m_filling =
false;
341 m_v.m_dataSize =
m_v.m_data.size();
343 m_v.m_filling =
false;
365 template <
typename... Args>
377 friend class ::TestDetSet;
395 bool expected =
false;
396 while (!iContainer.
m_filling.compare_exchange_weak(expected,
true, std::memory_order_acq_rel)) {
398 nanosleep(
nullptr,
nullptr);
441 m_ids.reserve(isize);
447 m_ids.shrink_to_fit();
451 void resize(
size_t isize,
size_t dsize) {
486 if ((*p).isValid() && (*p).size > 0 &&
m_data.size() == (*p).offset + (*p).size) {
487 m_data.resize((*p).offset);
497 if (
p !=
m_ids.end() && !(it < *
p))
509 return p !=
m_ids.end() && (*p).isValid();
524 return DetSet(*
this, *
p,
true);
531 return (
p ==
m_ids.end()) ?
end() : boost::make_transform_iterator(
p, IterHelp(*
this,
update));
536 std::pair<const_IdIter, const_IdIter>
p = std::equal_range(
m_ids.begin(),
m_ids.end(),
Item(
i));
537 return (
p.first !=
p.second) ?
p.first :
m_ids.end();
542 return boost::make_transform_iterator(
m_ids.begin(), IterHelp(*
this,
update));
547 return boost::make_transform_iterator(
m_ids.end(), IterHelp(*
this,
update));
551 template <
typename CMP>
554 std::pair<const_IdIter, const_IdIter>
p = std::equal_range(
m_ids.begin(),
m_ids.end(),
i,
cmp);
555 return Range(boost::make_transform_iterator(
p.first, IterHelp(*
this,
update)),
556 boost::make_transform_iterator(
p.second, IterHelp(*
this,
update)));
604 template <
typename T>
612 template <
typename T>
614 const std::vector<det_id_type>& iDets,
619 m_ids.reserve(iDets.size());
621 for (std::vector<det_id_type>::const_iterator itDetId = iDets.begin(), itDetIdEnd = iDets.end();
622 itDetId != itDetIdEnd;
624 assert(sanityCheck < *itDetId &&
"vector of det_id_type was not ordered");
625 sanityCheck = *itDetId;
626 m_ids.push_back(*itDetId);
630 template <
typename T>
637 if (
item.initialize()) {
640 TSFastFiller
ff(*
this,
item);
647 template <
typename T>
652 while (
item.initializing())
653 nanosleep(
nullptr,
nullptr);
654 m_data = &icont.data();
656 m_offset =
item.offset;
662 #include <type_traits> 667 namespace refhelper {
668 template <
typename T>
676 namespace refhelper {
677 template <
typename T>
684 return &(iContainer[iIndex]);
688 template <
typename T>
698 template <
class HandleT>
701 const HandleT& iHandle,
typename HandleT::element_type::value_type::const_iterator itIter) {
702 static_assert(std::is_same<
typename HandleT::element_type,
704 "Handle and DetSetVector do not have compatible types.");
705 auto index = itIter - &iHandle->data().front();
707 iHandle.id(), &(*itIter),
index);
714 template <
typename T>
721 return iElement - &(iContainer->
data().front());
729 template <
typename T>
735 template <
typename T,
typename Selector>
738 unsigned int& iIndex,
742 for (
auto iter = detset.
begin(), end = detset.
end(); iter != end; ++iter, ++iIndex) {
745 if (detset.
begin() != detset.
end()) {
Item & operator=(Item const &rh) noexcept
edm::Ref< typename HandleT::element_type, typename HandleT::element_type::value_type::value_type > makeRefTo(const HandleT &iHandle, typename HandleT::element_type::value_type::const_iterator itIter)
static unsigned int indexFor(const value_type *iElement, const edmNew::DetSetVector< T > *iContainer)
size_type dataSize() const
void swap(DetSetVectorTrans &rh)
void push_back(data_type const &d)
data_type operator()(size_t cell, size_t frame) const
static DetSetVector< T >::Item & dummy()
DetSetVector< T >::id_type id_type
void reserve(size_type s)
result_type operator()(first_argument_type iContainer, second_argument_type iIndex)
std::vector< data_type > DataContainer
std::pair< const_iterator, const_iterator > Range
Item & push_back(id_type iid)
void checkCapacityExausted() const
std::vector< Trans::Item > m_ids
void fillCollectionForThinning(Item const &item, Selector &selector, unsigned int iIndex, Collection &output, ThinnedAssociation &association)
IdContainer::iterator IdIter
bool initializing() const
void set(Container const &icont, typename Container::Item const &item, bool update=true)
void push_back(data_type &&d)
void throwCapacityExausted()
void reserve(size_type s)
edmNew::DetSetVector< T >::FindForDetSetVector value
data_type const * data(size_t cell) const
std::vector< data_type >::const_iterator const_DataIter
const_IdIter findItem(id_type i) const
void push_back(data_type &&d)
void swap(DetSetVector &rh)
void throw_range(det_id_type iid)
DetSetVector(int isubdet=0)
TSFastFiller(DetSetVector< T > const &iv, typename DetSetVector< T >::Item const &it)
void pop_back(id_type iid)
#define CMS_CLASS_VERSION(_version_)
friend class TSFastFiller
Item(Item const &rh) noexcept
DetSetVectorTrans(const DetSetVectorTrans &rh)
DetSetVectorTrans & operator=(const DetSetVectorTrans &)=delete
DetSetVector< T > const & m_v
void swap(Association< C > &lhs, Association< C > &rhs)
DetSetVector< T > const * m_v
const_iterator end(bool update=false) const
dstvdetails::DetSetVectorTrans Trans
bool isValid(id_type i) const
void emplace_back(Args &&... args)
DataContainer const & data() const
IterHelp(DetSetVector< T > const &iv, bool iup)
std::tuple< layerClusterToCaloParticle, caloParticleToLayerCluster > association
Item & addItem(id_type iid, size_type isize)
typename edmNew::DetSetVector< T >::data_type type
DetSet operator[](id_type i) const
DetSetVector & operator=(const DetSetVector &)=delete
DetSetVector< T >::data_type value_type
size_type detsetSize(size_t cell) const
static DetSetVector< T >::Item const & dummy()
DetSetVectorTrans & operator=(DetSetVectorTrans &&rh)
unsigned int second_argument_type
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
DetSetVector< T >::Item & m_item
void push_back(data_type const &d)
FastFiller(DetSetVector< T > &iv, id_type id, bool isaveEmpty=false)
#define CMS_THREAD_GUARD(_var_)
FindSetForNewDetSetVector< T > value
DetSetVector< T >::size_type size_type
id_type id(size_t cell) const
Item(id_type i=0, int io=-1, size_type is=0)
DetSetVector< T >::Item const & m_item
void swap(IdContainer &iic, DataContainer &idc)
Functor that operates on <T>
DetSetVector< T >::id_type key_type
static size_t size(const edmNew::DetSetVector< T > *iContainer)
void resize(size_t isize, size_t dsize)
TSFastFiller(DetSetVector< T > &iv, id_type id)
std::atomic< int > offset
DetSet insert(id_type iid, data_type const *idata, size_type isize)
std::pair< IdIter, DataIter > IterPair
bool exists(id_type i) const
Namespace of DDCMS conversion namespace.
unsigned int second_argument_type
std::vector< Item > IdContainer
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
friend class FindForDetSetVector
dslv::LazyGetter< T > Getter
const_iterator begin(bool update=false) const
DetSetVector< T >::id_type key_type
void errorIdExists(det_id_type iid)
bool operator<(Item const &rh) const
result_type operator()(first_argument_type iContainer, second_argument_type iIndex)
Item const & item(size_t cell) const
void reserve(size_t isize, size_t dsize)
void checkCapacityExausted(size_type s) const
data_type & operator[](size_type i)
void update(Item const &item) const
std::vector< data_type >::iterator DataIter
IdContainer const & ids() const
CapacityExaustedException()
DetSet insert(id_type iid, size_type isize)
const_iterator find(id_type i, bool update=false) const
void emplace_back(Args &&... args)
std::atomic< size_type > m_dataSize
std::atomic< bool > m_filling
IdContainer::const_iterator const_IdIter
edmNew::DetSet< T > DetSet
bool uninitialized() const
std::pair< const_IdIter, const_DataIter > const_IterPair
FastFiller(DetSetVector< T > &iv, typename DetSetVector< T >::Item &it, bool isaveEmpty=false)
void fillCollectionForThinning(edmNew::DetSet< T > const &detset, Selector &selector, unsigned int &iIndex, edmNew::DetSetVector< T > &output, edm::ThinnedAssociation &association)
data_type & operator[](size_type i)
edm::refhelper::FindForNewDetSetVector< data_type > RefFinder
DetSetVectorTrans(DetSetVectorTrans &&rh)
std::shared_ptr< void > m_getter
DetSetVector< T >::size_type size_type
DetSetVector< T >::id_type id_type
DetSetVector< T >::data_type value_type
Range equal_range(id_type i, CMP cmp, bool update=false) const
result_type operator()(Item const &item) const
Item & operator=(Item &&rh) noexcept