12#ifndef ROOT_TCollectionProxyInfo
13#define ROOT_TCollectionProxyInfo
25#include <forward_list>
35 #define TYPENAME typename
38 #define TYPENAME typename
77 static void*
get(
typename Cont_t::iterator &iter) {
78 return (
void*)&(*iter);
82 template <
typename Cont_t,
typename value_ptr>
struct IteratorValue<Cont_t, value_ptr*> {
83 static void*
get(
typename Cont_t::iterator &iter) {
84 return (
void*)(*iter);
91 template <
typename T>
struct IsStdVector : std::false_type {};
92 template <
typename T>
struct IsStdVector<std::vector<T>> : std::true_type {};
101 template <
typename Cont_t,
bool large = false>
111 static void*
copy(
void *dest_arena,
const void *source_ptr) {
116 static void*
next(
void *iter_loc,
const void *end_loc) {
142 template <
typename T>
struct Iterators<std::vector<T>, false> {
143 typedef std::vector<T> Cont_t;
145 typedef typename Cont_t::iterator
iterator;
150 *begin_arena =
nullptr;
151 *end_arena =
nullptr;
154 *begin_arena =
c->data();
155 *end_arena =
c->data() +
c->size();
157 static void*
copy(
void *
dest,
const void *source) {
158 *(
void**)
dest = *(
void**)(
const_cast<void*
>(source));
161 static void*
next(
void * ,
const void * ) {
170 R__ASSERT(0 &&
"Intentionally not implemented, do not use.");
176 static void destruct2(
void * ,
void * ) {
181 template <
typename Cont_t>
struct Iterators<Cont_t, true > {
189 *begin_arena =
nullptr;
190 *end_arena =
nullptr;
193 *begin_arena =
c->data();
194 *end_arena =
c->data() +
c->size();
200 static void*
copy(
void *dest_arena,
const void *source_ptr) {
202 *(
void**)dest_arena = *(
void**)(
const_cast<void*
>(source_ptr));
210 static void*
next(
void *iter_loc,
const void *end_loc) {
214 R__ASSERT(0 &&
"Intentionally not implemented, do not use.");
296 return const_cast<void*
>(
reinterpret_cast<const void*
>(&ref));
309 template <
class T,
class ALLOCATOR>
310 static size_t GetContainerSize(
const std::forward_list<T,ALLOCATOR>&
c) {
return std::distance(
c.begin(),
c.end());}
323 :
public Address<TYPENAME T::const_reference>
354 e->fIterator =
c->begin();
356 if ( 0 ==
e->fSize )
return e->fStart =
nullptr;
357 TYPENAME T::const_reference ref = *(
e->iter());
363 for (;
e->fIdx > 0 &&
e->iter() !=
c->end(); ++(
e->iter()), --
e->fIdx){ }
365 if (
e->iter() ==
c->end() )
return nullptr;
366 TYPENAME T::const_reference ref = *(
e->iter());
371 for (
size_t i=0; i<
size; ++i, ++
m)
375 static void*
collect(
void *coll,
void *array) {
378 for (
Iter_t i=
c->begin(); i !=
c->end(); ++i, ++
m )
384 for (
size_t i=0; i <
size; ++i, ++
m )
414 static void*
feed(
void *from,
void *to,
size_t size) {
417 for (
size_t i=0; i<
size; ++i, ++
m)
447 static void*
feed(
void *from,
void *to,
size_t size) {
449 if (
size==0)
return nullptr;
452 for (
size_t i=0; i<
size; ++i, --
m){
479 static void*
feed(
void *from,
void *to,
size_t size) {
482 for (
size_t i=0; i<
size; ++i, ++
m)
511 static void*
feed(
void *from,
void *to,
size_t size) {
514 for (
size_t i=0; i<
size; ++i, ++
m)
532 void* (*fSizeFunc)(
void*);
534 void* (*fClearFunc)(
void*);
535 void* (*fFirstFunc)(
void*);
536 void* (*fNextFunc)(
void*);
537 void* (*fConstructFunc)(
void*,size_t);
539 void* (*fFeedFunc)(
void*,
void*,size_t);
540 void* (*fCollectFunc)(
void*,
void*);
541 void* (*fCreateEnv)();
549 void* (*fCopyIterator)(
void *
dest,
const void *source);
554 void* (*fNext)(
void *iter,
const void *end);
570 void* (*size_func)(
void*),
571 void (*resize_func)(
void*,
size_t),
572 void* (*clear_func)(
void*),
573 void* (*first_func)(
void*),
574 void* (*next_func)(
void*),
575 void* (*construct_func)(
void*,
size_t),
576 void (*destruct_func)(
void*,
size_t),
577 void* (*feed_func)(
void*,
void*,
size_t),
578 void* (*collect_func)(
void*,
void*),
579 void* (*create_env)(),
580 void (*getIterators)(
void *collection,
void **begin_arena,
void **end_arena,
TVirtualCollectionProxy *proxy) =
nullptr,
581 void* (*copyIterator)(
void *
dest,
const void *source) =
nullptr,
582 void* (*next)(
void *iter,
const void *end) =
nullptr,
583 void (*deleteSingleIterator)(
void *iter) =
nullptr,
584 void (*deleteTwoIterators)(
void *begin,
void *end) =
nullptr
608 (((
char*)&
p->second)-((
char*)&
p->first)),
620 T::Iterators_t::create,
621 T::Iterators_t::copy,
622 T::Iterators_t::next,
623 T::Iterators_t::destruct1,
624 T::Iterators_t::destruct2);
638 (((
char*)&
p->second)-((
char*)&
p->first)),
659 typedef std::vector<Bool_t, A>
Cont_t;
660 typedef typename Cont_t::iterator
Iter_t;
661 typedef typename Cont_t::value_type
Value_t;
662 typedef Environ<Iter_t>
Env_t;
672 static void*
size(
void* env) {
677 static void*
clear(
void* env) {
681 static void*
first(
void* env) {
688 e->fIterator =
c->begin();
689 e->fSize =
c->size();
692 static void*
next(
void* env) {
695 for (;
e->fIdx > 0 &&
e->iter() !=
c->end(); ++(
e->iter()), --
e->fIdx){ }
703 static void*
collect(
void *coll,
void *array) {
706 for (
Iter_t i=
c->begin(); i !=
c->end(); ++i, ++
m )
710 static void destruct(
void*,
size_t) {
718 typedef typename Cont_t::iterator iterator;
721 PCont_t
c = PCont_t(coll);
722 new (*begin_arena) iterator(
c->begin());
723 new (*end_arena) iterator(
c->end());
725 static void* copy(
void *dest_arena,
const void *source_ptr) {
726 const iterator *source = (
const iterator *)(source_ptr);
727 new (dest_arena) iterator(*source);
730 static void* next(
void *,
const void *) {
731 R__ASSERT(
false &&
"Intentionally not implemented, should use VectorLooper or similar for vector<bool>.");
734 static void destruct1(
void *iter_ptr) {
735 iterator *start = (iterator *)(iter_ptr);
738 static void destruct2(
void *begin_ptr,
void *end_ptr) {
739 iterator *start = (iterator *)(begin_ptr);
740 iterator *end = (iterator *)(end_ptr);
749 template <
class A>
struct TCollectionProxyInfo::Pushback<std::vector<Bool_t, A> > :
public TCollectionProxyInfo::Type<std::vector<Bool_t, A> > {
750 typedef std::vector<Bool_t, A>
Cont_t;
751 typedef typename Cont_t::iterator
Iter_t;
752 typedef typename Cont_t::value_type
Value_t;
753 typedef Environ<Iter_t>
Env_t;
758 static void resize(
void* obj,
size_t n) {
762 static void*
feed(
void* from,
void *to,
size_t size) {
765 for (
size_t i=0; i<
size; ++i, ++
m)
775 template <
class A>
struct TCollectionProxyInfo::Address<std::vector<Bool_t, A>> {
777 static void*
address(
typename std::vector<Bool_t, A>::const_reference) {
778 R__ASSERT(
false &&
"Intentionally not implemented, should use VectorLooper or other functions specialized for "
779 "vector<bool> instead");
811 e->fIterator.first = 0;
812 e->fIterator.second =
c->size() > 0 ?
c->test(
e->fIterator.first) : false ;
813 e->fSize =
c->size();
814 return &(
e->fIterator.second);
819 for (;
e->fIdx > 0 &&
e->fIterator.first !=
c->size(); ++(
e->fIterator.first), --
e->fIdx){ }
820 e->fIterator.second = (
e->fIterator.first !=
c->size()) ?
c->test(
e->fIterator.first) :
false;
821 return &(
e->fIterator.second);
827 static void*
collect(
void *coll,
void *array) {
830 for (
size_t i=0; i !=
c->size(); ++i, ++
m )
842 union PtrSize_t {
size_t fIndex;
void *
fAddress; };
851 begin->first.fIndex = 0;
852 begin->second =
false;
854 end->first.fAddress = coll;
857 static void*
copy(
void *dest_arena,
const void *source_ptr) {
862 static void*
next(
void *iter_loc,
const void *end_loc) {
866 if (iter->first.fIndex !=
c->size()) {
867 iter->second =
c->test(iter->first.fIndex);
868 ++(iter->first.fIndex);
869 return &(iter->second);
888 template <
typename Bitset_t>
901 static void*
feed(
void *from,
void *to,
size_t size) {
904 for (
size_t i=0; i<
size; ++i, ++
m)
916using namespace Detail;
Basic types used by ROOT and required by TInterpreter.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t dest
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
void *(* fCopyIterator)(void *dest, const void *source)
void *(* fConstructFunc)(void *, size_t)
void *(* fClearFunc)(void *)
static const UInt_t fgIteratorArenaSize
void *(* fFirstFunc)(void *)
void(* fDestructFunc)(void *, size_t)
TCollectionProxyInfo(const std::type_info &info, size_t iter_size, size_t value_diff, int value_offset, void *(*size_func)(void *), void(*resize_func)(void *, size_t), void *(*clear_func)(void *), void *(*first_func)(void *), void *(*next_func)(void *), void *(*construct_func)(void *, size_t), void(*destruct_func)(void *, size_t), void *(*feed_func)(void *, void *, size_t), void *(*collect_func)(void *, void *), void *(*create_env)(), void(*getIterators)(void *collection, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy)=nullptr, void *(*copyIterator)(void *dest, const void *source)=nullptr, void *(*next)(void *iter, const void *end)=nullptr, void(*deleteSingleIterator)(void *iter)=nullptr, void(*deleteTwoIterators)(void *begin, void *end)=nullptr)
void(* fDeleteTwoIterators)(void *begin, void *end)
void *(* fCollectFunc)(void *, void *)
void *(* fSizeFunc)(void *)
void *(* fNextFunc)(void *)
void *(* fFeedFunc)(void *, void *, size_t)
void(* fDeleteSingleIterator)(void *iter)
void(* fResizeFunc)(void *, size_t)
static TCollectionProxyInfo Get(const T &)
void(* fCreateIterators)(void *collection, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy)
static TCollectionProxyInfo * Generate(const T &)
Generate proxy from template.
void *(* fNext)(void *iter, const void *end)
const std::type_info & fInfo
A "std::vector"-like collection of values implementing handy operation to analyse them.
Defines a common interface to inspect/change the contents of an object that represents a collection.
static void * address(T ref)
EnvironBase(const EnvironBase &)
EnvironBase & operator=(const EnvironBase &)
Small helper to save proxy environment in the event of recursive calls.
Small helper to encapsulate all necessary data accesses for containers like set, multiset etc.
static void resize(void *, size_t)
static int value_offset()
static void * feed(void *from, void *to, size_t size)
static void * get(typename Cont_t::iterator &iter)
Small helper to encapsulate whether to return the value pointed to by the iterator or its address.
static void * get(typename Cont_t::iterator &iter)
Cont_t::iterator iterator
static void destruct2(void *begin_ptr, void *end_ptr)
static void * next(void *iter_loc, const void *end_loc)
static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *)
static void destruct1(void *begin_ptr)
static void * copy(void *dest_arena, const void *source_ptr)
Small helper to implement the function to create,access and destroy iterators.
static void * next(void *iter_loc, const void *end_loc)
static void * copy(void *dest_arena, const void *source_ptr)
static void destruct2(void *begin_ptr, void *end_ptr)
static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *)
Cont_t::iterator iterator
static void destruct1(void *iter_ptr)
Small helper to encapsulate all necessary data accesses for containers like set, multiset etc.
static void resize(void *, size_t)
static int value_offset()
static void * feed(void *from, void *to, size_t size)
PairHolder & operator=(const PairHolder &)=delete
PairHolder(const PairHolder &c)
static void resize(void *, size_t)
static void * feed(void *from, void *to, size_t size)
static int value_offset()
Small helper to encapsulate all necessary data accesses for containers like vector,...
static void resize(void *obj, size_t n)
static void * feed(void *from, void *to, size_t size)
static int value_offset()
Small helper to encapsulate all necessary data accesses for containers like forward_list.
static void resize(void *obj, size_t n)
static int value_offset()
static void * feed(void *from, void *to, size_t size)
static size_t GetContainerSize(const std::forward_list< T, ALLOCATOR > &c)
static size_t GetContainerSize(const T &c)
static void destruct2(void *begin_ptr, void *end_ptr)
static void * copy(void *dest_arena, const void *source_ptr)
static void * next(void *iter_loc, const void *end_loc)
static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *)
std::pair< PtrSize_t, Bool_t > iterator
static void destruct1(void *iter_ptr)
static void destruct(void *, size_t)
std::pair< size_t, Bool_t > Iter_t
static void * construct(void *, size_t)
static void * collect(void *coll, void *array)
static void * next(void *env)
static void * first(void *env)
static void * clear(void *env)
static void * size(void *env)
static PCont_t object(void *ptr)
Small helper to encapsulate basic data accesses for all STL continers.
static const bool fgLargeIterator
static void * clear(void *env)
static void destruct(void *what, size_t size)
static void * first(void *env)
static void * size(void *env)
static void * next(void *env)
static void * construct(void *what, size_t size)
Iterators< Cont_t, fgLargeIterator > Iterators_t
static PCont_t object(void *ptr)
static void * collect(void *coll, void *array)