1 #ifndef DataFormats_Common_DetSetVectorNew_h
2 #define DataFormats_Common_DetSetVectorNew_h
9 #include <boost/iterator_adaptors.hpp>
10 #include <boost/iterator/transform_iterator.hpp>
11 #include <boost/iterator/counting_iterator.hpp>
12 #include <boost/any.hpp>
13 #include "boost/shared_ptr.hpp"
31 namespace dstvdetails {
66 class DetSetVector :
private dstvdetails::DetSetVectorTrans {
83 typedef typename IdContainer::iterator
IdIter;
84 typedef typename std::vector<data_type>::iterator
DataIter;
107 typedef std::pair<const_iterator,const_iterator>
Range;
160 v.m_data.push_back(d);
172 class FindForDetSetVector :
public std::binary_function<const edmNew::DetSetVector<T>&, unsigned int, const T*> {
175 typename self::result_type
operator()(
typename self::first_argument_type iContainer,
typename self::second_argument_type iIndex) {
176 return &(iContainer.m_data[iIndex]);
204 m_ids.reserve(isize);
208 void resize(
size_t isize,
size_t dsize) {
218 return DetSet(*
this,item);
224 return DetSet(*
this,item);
235 if (p==
m_ids.end())
return;
237 if ((*p).size>0&& (*p).offset>-1 &&
238 m_data.size()==(*p).offset+(*p).size)
239 m_data.resize((*p).offset);
251 return *
m_ids.insert(p,it);
267 return p!=
m_ids.end() && (*p).offset!=-1;
289 boost::make_transform_iterator(p,
295 std::pair<const_IdIter,const_IdIter>
p =
297 return (p.first!=p.second) ? p.first :
m_ids.end();
301 return boost::make_transform_iterator(
m_ids.begin(),
306 return boost::make_transform_iterator(
m_ids.end(),
312 template<
typename CMP>
314 std::pair<const_IdIter,const_IdIter>
p =
316 return Range(boost::make_transform_iterator(p.first,
IterHelp(*
this)),
317 boost::make_transform_iterator(p.second,
IterHelp(*
this))
343 return m_ids[cell].id;
378 template<
typename T>
390 const std::vector<det_id_type>& iDets,
395 m_ids.reserve(iDets.size());
397 for(std::vector<det_id_type>::const_iterator itDetId = iDets.begin(), itDetIdEnd = iDets.end();
398 itDetId != itDetIdEnd;
400 assert(sanityCheck < *itDetId &&
"vector of det_id_type was not ordered");
401 sanityCheck = *itDetId;
402 m_ids.push_back(*itDetId);
409 if (getter.empty() || item.
offset!=-1)
return;
410 item.
offset = int(m_data.size());
412 (*boost::any_cast<boost::shared_ptr<Getter> >(&getter))->fill(ff);
419 m_id(0), m_data(0), m_size(0){
430 m_data=&icont.data()[item.
offset];
437 #include <boost/mpl/assert.hpp>
438 #include <boost/type_traits/is_same.hpp>
443 namespace refhelper {
452 namespace refhelper {
456 typename self::result_type
operator()(
typename self::first_argument_type iContainer,
typename self::second_argument_type iIndex) {
457 return &(iContainer[iIndex]);
471 template<
class HandleT>
474 typename HandleT::element_type::value_type::const_iterator itIter) {
477 return edm::Ref<
typename HandleT::element_type,
493 return iElement-&(iContainer->
data().front());
bool isValid(id_type i) const
DataContainer const & data() const
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)
void push_back(data_type const &d)
void update(Item const &item) const
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
const_iterator begin() const
size_type dataSize() const
DetSetVector< T >::id_type id_type
void reserve(size_type s)
std::vector< data_type > DataContainer
Item & push_back(id_type iid)
Range equal_range(id_type i, CMP cmp) const
const_IdIter findItem(id_type i) const
IdContainer::iterator IdIter
edmNew::DetSetVector< T >::FindForDetSetVector value
std::vector< data_type >::const_iterator const_DataIter
void swap(DetSetVector &rh)
void throw_range(det_id_type iid)
std::pair< const_IdIter, const_DataIter > const_IterPair
DetSetVector(int isubdet=0)
std::pair< const_iterator, const_iterator > Range
void pop_back(id_type iid)
#define CMS_CLASS_VERSION(_version_)
const_iterator find(id_type i) const
id_type id(size_t cell) const
bool operator<(Item const &rh) const
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
DetSetVector< T > const * v
Item & addItem(id_type iid, size_type isize)
DetSetVector< T >::data_type value_type
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
void set(Container const &icont, typename Container::Item const &item)
bool exists(id_type i) const
data_type const * data(size_t cell) const
FastFiller(DetSetVector< T > &iv, id_type id, bool isaveEmpty=false)
FindSetForNewDetSetVector< T > value
Item(id_type i=0, int io=-1, size_type is=0)
DetSetVector< T >::Item & item
void swap(IdContainer &iic, DataContainer &idc)
const_iterator end() const
Container::value_type value_type
DetSetVector< T >::id_type key_type
static size_t size(const edmNew::DetSetVector< T > *iContainer)
void resize(size_t isize, size_t dsize)
size_type detsetSize(size_t cell) const
DetSet insert(id_type iid, data_type const *idata, size_type isize)
std::vector< Item > IdContainer
dslv::LazyGetter< T > Getter
void errorIdExists(det_id_type iid)
void reserve(size_t isize, size_t dsize)
std::vector< data_type >::iterator DataIter
result_type & operator()(Item const &item) const
DetSet insert(id_type iid, size_type isize)
std::pair< IdIter, DataIter > IterPair
void updateImpl(Item &item)
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
DetSetVector< T >::size_type size_type
DetSet operator[](id_type i) const
IterHelp(DetSetVector< T > const &iv)
void set(const std::string &name, int value)
set the flag, with a run-time name