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 {
63 assert(m_filling==
false); assert(rh.m_filling==
false);
65 #ifdef DSVN_USE_ATOMIC 66 m_dataSize.store(rh.m_dataSize.exchange(m_dataSize.load()));
73 assert(m_filling==
false); assert(rh.m_filling==
false);
75 #ifdef DSVN_USE_ATOMIC 76 m_dataSize.store(rh.m_dataSize.exchange(m_dataSize.load()));
84 #ifdef DSVN_USE_ATOMIC 87 mutable size_type m_dataSize;
92 assert(m_filling==
false); assert(rh.
m_filling==
false);
95 #ifdef DSVN_USE_ATOMIC 96 m_dataSize.store(rh.
m_dataSize.exchange(m_dataSize.load()));
121 #ifdef DSVN_USE_ATOMIC 125 return offset.compare_exchange_strong(expected,-2);
132 bool uninitialized()
const {
return (-1)==
offset;}
136 operator id_type()
const {
return id;}
139 #ifdef DSVN_USE_ATOMIC 142 if (!m_filling.compare_exchange_strong(expected,
true))
errorFilling();
146 bool ready()
const {
return true;}
182 typedef typename IdContainer::iterator
IdIter;
183 typedef typename std::vector<data_type>::iterator
DataIter;
198 m_detset.
set(*m_v,item,m_update);
208 typedef std::pair<const_iterator,const_iterator>
Range;
225 m_v(iv), m_item(m_v.ready()? m_v.push_back(id):
dummy()),m_saveEmpty(isaveEmpty) {
230 m_v(iv), m_item(it), m_saveEmpty(isaveEmpty) {
232 if(m_v.ready()) m_item.offset =
int(m_v.m_data.size());
236 if (!m_saveEmpty && m_item.size==0) {
237 m_v.pop_back(m_item.id);
239 assert(m_v.m_filling==
true);
246 m_v.pop_back(m_item.id);
260 if (m_item.offset+s <= m_v.m_data.capacity())
return;
262 m_v.m_data.reserve(m_item.offset+s);
267 checkCapacityExausted(s);
268 m_v.m_data.resize(m_item.offset+s);
269 m_v.m_dataSize = m_v.m_data.size();
273 id_type
id()
const {
return m_item.id;}
274 size_type
size()
const {
return m_item.size;}
275 bool empty()
const {
return m_item.size==0;}
278 return m_v.m_data[m_item.offset+
i];
280 DataIter
begin() {
return m_v.m_data.begin()+ m_item.offset;}
284 checkCapacityExausted();
285 m_v.m_data.push_back(d);
290 checkCapacityExausted();
296 data_type &
back() {
return m_v.m_data.back();}
300 friend class ::TestDetSet;
316 #ifdef DSVN_USE_ATOMIC 324 m_v(iv), m_item(m_v.ready()? iv.push_back(id):
dummy()) { assert(m_v.m_filling==
true); m_v.m_filling =
false;}
327 m_v(iv), m_item(it) {
332 while (!m_v.m_filling.compare_exchange_weak(expected,
true)) { expected=
false; nanosleep(
nullptr,
nullptr);}
333 int offset = m_v.m_data.size();
334 if (m_v.onDemand() &&
full()) {
335 m_v.m_filling =
false;
338 std::move(m_lv.begin(), m_lv.end(), std::back_inserter(m_v.m_data));
339 m_item.size=m_lv.size();
342 m_v.m_dataSize = m_v.m_data.size();
343 assert(m_v.m_filling==
true);
344 m_v.m_filling =
false;
350 int offset = m_v.m_dataSize;
351 return m_v.m_data.capacity()<offset+m_lv.size();
366 id_type
id()
const {
return m_item.id;}
367 size_type
size()
const {
return m_lv.size();}
368 bool empty()
const {
return m_lv.empty();}
373 DataIter
begin() {
return m_lv.begin();}
374 DataIter
end() {
return m_lv.end();}
383 data_type &
back() {
return m_lv.back();}
387 friend class ::TestDetSet;
396 friend class FastFiller;
397 friend class TSFastFiller;
400 class FindForDetSetVector :
public std::binary_function<const edmNew::DetSetVector<T>&, unsigned int, const T*> {
403 typename self::result_type
operator()(
typename self::first_argument_type iContainer,
typename self::second_argument_type iIndex)
404 #ifdef DSVN_USE_ATOMIC 407 while (!iContainer.m_filling.compare_exchange_weak(expected,
true,std::memory_order_acq_rel)) { expected=
false; nanosleep(
nullptr,
nullptr);}
408 typename self::result_type item = &(iContainer.m_data[iIndex]);
409 assert(iContainer.m_filling==
true);
410 iContainer.m_filling =
false;
417 friend class FindForDetSetVector;
420 m_subdetId(isubdet) {}
447 void swap(IdContainer & iic, DataContainer & idc) {
453 m_ids.reserve(isize);
454 m_data.reserve(dsize);
459 m_ids.shrink_to_fit();
460 m_data.shrink_to_fit();
463 void resize(
size_t isize,
size_t dsize) {
465 m_data.resize(dsize);
466 m_dataSize = m_data.size();
470 m_ids.erase(std::remove_if(m_ids.begin(),m_ids.end(),[](Item
const&
m){
return 0==
m.size;}),m_ids.end());
474 DetSet
insert(id_type iid, data_type
const * idata, size_type isize) {
475 Item & item = addItem(iid,isize);
476 m_data.resize(m_data.size()+isize);
478 m_dataSize = m_data.size();
479 return DetSet(*
this,item,
false);
482 DetSet
insert(id_type iid, size_type isize) {
483 Item & item = addItem(iid,isize);
484 m_data.resize(m_data.size()+isize);
485 m_dataSize = m_data.size();
486 return DetSet(*
this,item,
false);
491 return addItem(iid,0);
496 const_IdIter
p = findItem(iid);
497 if (p==m_ids.end())
return;
499 if ( (*p).isValid() && (*p).size>0 &&
500 m_data.size()==(*p).offset+(*p).size) {
501 m_data.resize((*p).offset);
502 m_dataSize = m_data.size();
504 m_ids.erase(m_ids.begin()+(p-m_ids.begin()));
509 Item &
addItem(id_type iid, size_type isize) {
510 Item it(iid,
size_type(m_data.size()),isize);
511 IdIter
p = std::lower_bound(m_ids.begin(),
526 return findItem(i)!=m_ids.end();
530 const_IdIter
p = findItem(i);
531 return p!=m_ids.end() && (*p).isValid();
544 const_IdIter
p = findItem(i);
546 return DetSet(*
this,*p,
true);
552 const_IdIter
p = findItem(i);
553 return (p==m_ids.end()) ?
end() :
554 boost::make_transform_iterator(p,
560 std::pair<const_IdIter,const_IdIter>
p =
561 std::equal_range(m_ids.begin(),m_ids.end(),Item(i));
562 return (p.first!=p.second) ? p.first : m_ids.end();
567 return boost::make_transform_iterator(m_ids.begin(),
573 return boost::make_transform_iterator(m_ids.end(),
579 template<
typename CMP>
582 std::pair<const_IdIter,const_IdIter>
p =
583 std::equal_range(m_ids.begin(),m_ids.end(),
i,cmp);
584 return Range(boost::make_transform_iterator(p.first,IterHelp(*
this,
update)),
585 boost::make_transform_iterator(p.second,IterHelp(*
this,
update))
591 bool empty()
const {
return m_ids.empty();}
596 size_type
size()
const {
return m_ids.size();}
601 return m_data[m_ids[cell].offset+frame];
604 data_type
const *
data(
size_t cell)
const {
605 return &m_data[m_ids[cell].offset];
608 size_type
detsetSize(
size_t cell)
const {
return m_ids[cell].size; }
610 id_type
id(
size_t cell)
const {
611 return m_ids[cell].id;
614 Item
const &
item(
size_t cell)
const {
620 IdContainer
const &
ids()
const {
return m_ids;}
621 DataContainer
const &
data()
const {
return m_data;}
629 friend class ::TestDetSet;
631 void update(Item const & item) const;
639 std::vector<Trans::Item> m_ids;
645 template<
typename T>
656 const std::vector<det_id_type>& iDets,
658 m_subdetId(isubdet) {
661 m_ids.reserve(iDets.size());
662 det_id_type sanityCheck = 0;
663 for(std::vector<det_id_type>::const_iterator itDetId = iDets.begin(), itDetIdEnd = iDets.end();
664 itDetId != itDetIdEnd;
666 assert(sanityCheck < *itDetId &&
"vector of det_id_type was not ordered");
667 sanityCheck = *itDetId;
668 m_ids.push_back(*itDetId);
672 #ifdef DSVN_USE_ATOMIC 676 if (m_getter.empty()) { assert(item.
isValid());
return;}
681 (*boost::any_cast<std::shared_ptr<Getter> >(&m_getter))->fill(ff);
689 #ifdef DSVN_USE_ATOMIC 694 if (update) icont.
update(item);
696 m_data=&icont.
data();
705 #include <type_traits> 710 namespace refhelper {
719 namespace refhelper {
723 typename self::result_type
operator()(
typename self::first_argument_type iContainer,
typename self::second_argument_type iIndex) {
724 return &(iContainer[iIndex]);
738 template<
class HandleT>
742 typename HandleT::element_type::value_type::const_iterator itIter) {
744 auto index = itIter - &iHandle->data().front();
745 return edm::Ref<
typename HandleT::element_type,
747 (iHandle.id(), &(*itIter),
index);
761 static size_t size(
const edmNew::DetSetVector<T>* iContainer) {
return iContainer->
dataSize();}
762 static unsigned int indexFor(
const value_type* iElement,
const edmNew::DetSetVector<T>* iContainer) {
763 return iElement-&(iContainer->
data().front());
768 #ifdef DSVN_USE_ATOMIC 769 #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)
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
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
self::result_type operator()(typename self::first_argument_type iContainer, typename self::second_argument_type iIndex)
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)
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)
std::vector< Item > IdContainer
dslv::LazyGetter< T > Getter
DetSetVector< T >::id_type key_type
void errorIdExists(det_id_type iid)
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
self::result_type operator()(typename self::first_argument_type iContainer, typename self::second_argument_type iIndex)
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