1 #ifndef DataFormats_Common_DetSetVectorNew_h 2 #define DataFormats_Common_DetSetVectorNew_h 9 #include <boost/iterator/transform_iterator.hpp> 10 #include <boost/any.hpp> 14 #if !defined(__ROOTCLING__) 15 #define DSVN_USE_ATOMIC 47 namespace dstvdetails {
66 #ifdef DSVN_USE_ATOMIC 76 assert(rh.m_filling==
false);
78 #ifdef DSVN_USE_ATOMIC 79 m_dataSize.store(rh.m_dataSize.exchange(m_dataSize.load()));
86 assert(m_filling==
false); assert(rh.m_filling==
false);
88 #ifdef DSVN_USE_ATOMIC 89 m_dataSize.store(rh.m_dataSize.exchange(m_dataSize.load()));
97 #ifdef DSVN_USE_ATOMIC 100 mutable size_type m_dataSize;
105 assert(m_filling==
false); assert(rh.
m_filling==
false);
108 #ifdef DSVN_USE_ATOMIC 109 m_dataSize.store(rh.
m_dataSize.exchange(m_dataSize.load()));
134 #ifdef DSVN_USE_ATOMIC 138 return offset.compare_exchange_strong(expected,-2);
145 bool uninitialized()
const {
return (-1)==
offset;}
149 operator id_type()
const {
return id;}
152 #ifdef DSVN_USE_ATOMIC 155 if (!m_filling.compare_exchange_strong(expected,
true))
errorFilling();
159 bool ready()
const {
return true;}
195 typedef typename IdContainer::iterator
IdIter;
196 typedef typename std::vector<data_type>::iterator
DataIter;
211 m_detset.
set(*m_v,item,m_update);
221 typedef std::pair<const_iterator,const_iterator>
Range;
238 m_v(iv), m_item(m_v.ready()? m_v.push_back(id):
dummy()),m_saveEmpty(isaveEmpty) {
243 m_v(iv), m_item(it), m_saveEmpty(isaveEmpty) {
245 if(m_v.ready()) m_item.offset =
int(m_v.m_data.size());
249 if (!m_saveEmpty && m_item.size==0) {
250 m_v.pop_back(m_item.id);
252 assert(m_v.m_filling==
true);
259 m_v.pop_back(m_item.id);
273 if (m_item.offset+s <= m_v.m_data.capacity())
return;
275 m_v.m_data.reserve(m_item.offset+s);
280 checkCapacityExausted(s);
281 m_v.m_data.resize(m_item.offset+s);
282 m_v.m_dataSize = m_v.m_data.size();
286 id_type
id()
const {
return m_item.id;}
287 size_type
size()
const {
return m_item.size;}
288 bool empty()
const {
return m_item.size==0;}
291 return m_v.m_data[m_item.offset+
i];
293 DataIter
begin() {
return m_v.m_data.begin()+ m_item.offset;}
297 checkCapacityExausted();
298 m_v.m_data.push_back(d);
303 checkCapacityExausted();
309 data_type &
back() {
return m_v.m_data.back();}
313 friend class ::TestDetSet;
329 #ifdef DSVN_USE_ATOMIC 337 m_v(iv), m_item(m_v.ready()? iv.push_back(id):
dummy()) { assert(m_v.m_filling==
true); m_v.m_filling =
false;}
340 m_v(iv), m_item(it) {
345 while (!m_v.m_filling.compare_exchange_weak(expected,
true)) { expected=
false; nanosleep(
nullptr,
nullptr);}
346 int offset = m_v.m_data.size();
347 if (m_v.onDemand() &&
full()) {
348 m_v.m_filling =
false;
351 std::move(m_lv.begin(), m_lv.end(), std::back_inserter(m_v.m_data));
352 m_item.size=m_lv.size();
355 m_v.m_dataSize = m_v.m_data.size();
356 assert(m_v.m_filling==
true);
357 m_v.m_filling =
false;
363 int offset = m_v.m_dataSize;
364 return m_v.m_data.capacity()<offset+m_lv.size();
379 id_type
id()
const {
return m_item.id;}
380 size_type
size()
const {
return m_lv.size();}
381 bool empty()
const {
return m_lv.empty();}
386 DataIter
begin() {
return m_lv.begin();}
387 DataIter
end() {
return m_lv.end();}
396 data_type &
back() {
return m_lv.back();}
400 friend class ::TestDetSet;
420 #ifdef DSVN_USE_ATOMIC 423 while (!iContainer.
m_filling.compare_exchange_weak(expected,
true,std::memory_order_acq_rel)) { expected=
false; nanosleep(
nullptr,
nullptr);}
436 m_subdetId(isubdet) {}
467 void swap(IdContainer & iic, DataContainer & idc) {
473 m_ids.reserve(isize);
474 m_data.reserve(dsize);
479 m_ids.shrink_to_fit();
480 m_data.shrink_to_fit();
483 void resize(
size_t isize,
size_t dsize) {
485 m_data.resize(dsize);
486 m_dataSize = m_data.size();
490 m_ids.erase(std::remove_if(m_ids.begin(),m_ids.end(),[](Item
const&
m){
return 0==
m.size;}),m_ids.end());
494 DetSet
insert(id_type iid, data_type
const * idata, size_type isize) {
495 Item & item = addItem(iid,isize);
496 m_data.resize(m_data.size()+isize);
498 m_dataSize = m_data.size();
499 return DetSet(*
this,item,
false);
502 DetSet
insert(id_type iid, size_type isize) {
503 Item & item = addItem(iid,isize);
504 m_data.resize(m_data.size()+isize);
505 m_dataSize = m_data.size();
506 return DetSet(*
this,item,
false);
511 return addItem(iid,0);
516 const_IdIter
p = findItem(iid);
517 if (p==m_ids.end())
return;
519 if ( (*p).isValid() && (*p).size>0 &&
520 m_data.size()==(*p).offset+(*p).size) {
521 m_data.resize((*p).offset);
522 m_dataSize = m_data.size();
524 m_ids.erase(m_ids.begin()+(p-m_ids.begin()));
529 Item &
addItem(id_type iid, size_type isize) {
530 Item it(iid,
size_type(m_data.size()),isize);
546 return findItem(i)!=m_ids.end();
550 const_IdIter
p = findItem(i);
551 return p!=m_ids.end() && (*p).isValid();
564 const_IdIter
p = findItem(i);
566 return DetSet(*
this,*p,
true);
572 const_IdIter
p = findItem(i);
573 return (p==m_ids.end()) ?
end() :
574 boost::make_transform_iterator(p,
580 std::pair<const_IdIter,const_IdIter>
p =
581 std::equal_range(m_ids.begin(),m_ids.end(),Item(i));
582 return (p.first!=p.second) ? p.first : m_ids.end();
587 return boost::make_transform_iterator(m_ids.begin(),
593 return boost::make_transform_iterator(m_ids.end(),
599 template<
typename CMP>
602 std::pair<const_IdIter,const_IdIter>
p =
603 std::equal_range(m_ids.begin(),m_ids.end(),
i,cmp);
611 bool empty()
const {
return m_ids.empty();}
616 size_type
size()
const {
return m_ids.size();}
621 return m_data[m_ids[cell].offset+frame];
624 data_type
const *
data(
size_t cell)
const {
625 return &m_data[m_ids[cell].offset];
628 size_type
detsetSize(
size_t cell)
const {
return m_ids[cell].size; }
630 id_type
id(
size_t cell)
const {
631 return m_ids[cell].id;
634 Item
const &
item(
size_t cell)
const {
640 IdContainer
const &
ids()
const {
return m_ids;}
641 DataContainer
const &
data()
const {
return m_data;}
649 friend class ::TestDetSet;
651 void update(Item const & item) const;
659 std::vector<Trans::Item> m_ids;
665 template<
typename T>
676 const std::vector<det_id_type>& iDets,
678 m_subdetId(isubdet) {
681 m_ids.reserve(iDets.size());
682 det_id_type sanityCheck = 0;
683 for(std::vector<det_id_type>::const_iterator itDetId = iDets.begin(), itDetIdEnd = iDets.end();
684 itDetId != itDetIdEnd;
686 assert(sanityCheck < *itDetId &&
"vector of det_id_type was not ordered");
687 sanityCheck = *itDetId;
688 m_ids.push_back(*itDetId);
692 #ifdef DSVN_USE_ATOMIC 696 if (m_getter.empty()) { assert(item.
isValid());
return;}
701 (*boost::any_cast<std::shared_ptr<Getter> >(&m_getter))->fill(ff);
709 #ifdef DSVN_USE_ATOMIC 714 if (update) icont.
update(item);
716 m_data=&icont.
data();
725 #include <type_traits> 730 namespace refhelper {
739 namespace refhelper {
747 return &(iContainer[iIndex]);
761 template<
class HandleT>
765 typename HandleT::element_type::value_type::const_iterator itIter) {
767 auto index = itIter - &iHandle->data().front();
768 return edm::Ref<
typename HandleT::element_type,
770 (iHandle.id(), &(*itIter),
index);
784 static size_t size(
const edmNew::DetSetVector<T>* iContainer) {
return iContainer->
dataSize();}
785 static unsigned int indexFor(
const value_type* iElement,
const edmNew::DetSetVector<T>* iContainer) {
786 return iElement-&(iContainer->
data().front());
791 #ifdef DSVN_USE_ATOMIC 792 #undef DSVN_USE_ATOMIC
bool isValid(id_type i) const
DataContainer const & data() const
static unsigned int indexFor(const value_type *iElement, const edmNew::DetSetVector< T > *iContainer)
void swap(DetSetVectorTrans &rh)
void push_back(data_type const &d)
void update(Item const &item) const
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
const_iterator end(bool update=false) const
static DetSetVector< T >::Item & dummy()
size_type dataSize() const
DetSetVector< T >::id_type id_type
void reserve(size_type s)
result_type operator()(first_argument_type iContainer, second_argument_type iIndex)
Range equal_range(id_type i, CMP cmp, bool update=false) const
std::vector< data_type > DataContainer
Item & push_back(id_type iid)
const_IdIter findItem(id_type i) const
std::vector< Trans::Item > m_ids
PixelRecoRange< float > Range
bool any(const std::vector< T > &v, const T &what)
IdContainer::iterator IdIter
void checkCapacityExausted(size_type s) 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
std::vector< data_type >::const_iterator const_DataIter
void push_back(data_type &&d)
void swap(DetSetVector &rh)
void throw_range(det_id_type iid)
std::pair< const_IdIter, const_DataIter > const_IterPair
Item & operator=(Item &&rh)
DetSetVector(int isubdet=0)
std::pair< const_iterator, const_iterator > Range
TSFastFiller(DetSetVector< T > const &iv, typename DetSetVector< T >::Item const &it)
void pop_back(id_type iid)
#define CMS_CLASS_VERSION(_version_)
id_type id(size_t cell) const
DetSetVectorTrans(const DetSetVectorTrans &rh)
DetSetVector< T > const & m_v
bool operator<(Item const &rh) const
void swap(Association< C > &lhs, Association< C > &rhs)
DetSetVector< T > const * m_v
dstvdetails::DetSetVectorTrans Trans
Item const & item(size_t cell) const
void checkCapacityExausted() const
Container::value_type value_type
IterHelp(DetSetVector< T > const &iv, bool iup)
Ref< typename HandleT::element_type, typename HandleT::element_type::value_type::value_type > makeRefTo(const HandleT &iHandle, det_id_type iDetID, typename HandleT::element_type::value_type::const_iterator itIter)
Item & addItem(id_type iid, size_type isize)
DetSetVector< T >::data_type value_type
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
bool exists(id_type i) const
void push_back(data_type const &d)
IdContainer const & ids() const
bool initializing() const
data_type const * data(size_t cell) const
FastFiller(DetSetVector< T > &iv, id_type id, bool isaveEmpty=false)
#define CMS_THREAD_GUARD(_var_)
FindSetForNewDetSetVector< T > value
DetSetVector< T >::size_type size_type
Item(id_type i=0, int io=-1, size_type is=0)
DetSetVector< T >::Item const & m_item
void swap(IdContainer &iic, DataContainer &idc)
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)
size_type detsetSize(size_t cell) const
std::atomic< int > offset
DetSetVector()
Create an empty DetSetVector.
DetSet insert(id_type iid, data_type const *idata, size_type isize)
unsigned int second_argument_type
std::vector< Item > IdContainer
dslv::LazyGetter< T > Getter
DetSetVector< T >::id_type key_type
void errorIdExists(det_id_type iid)
result_type operator()(first_argument_type iContainer, second_argument_type iIndex)
void reserve(size_t isize, size_t dsize)
data_type & operator[](size_type i)
std::vector< data_type >::iterator DataIter
result_type & operator()(Item const &item) const
const_iterator find(id_type i, bool update=false) const
CapacityExaustedException()
Item & operator=(Item const &rh)
DetSet insert(id_type iid, size_type isize)
std::pair< IdIter, DataIter > IterPair
std::atomic< size_type > m_dataSize
std::atomic< bool > m_filling
IdContainer::const_iterator const_IdIter
data_type operator()(size_t cell, size_t frame) const
edmNew::DetSet< T > DetSet
FastFiller(DetSetVector< T > &iv, typename DetSetVector< T >::Item &it, bool isaveEmpty=false)
data_type & operator[](size_type i)
edm::refhelper::FindForNewDetSetVector< data_type > RefFinder
DetSetVectorTrans(DetSetVectorTrans &&rh)
DetSetVector< T >::size_type size_type
DetSetVector< T >::id_type id_type
DetSet operator[](id_type i) const
DetSetVector< T >::data_type value_type
const_iterator begin(bool update=false) const