15 /**************************************************************************/
17 /**************************************************************************/
22 VoidCPlex(const VoidCPlex&); // Not implemented
23 VoidCPlex& operator=(const VoidCPlex&); // Not implemented
26 Int_t fS; // Size of atom
27 Int_t fN; // Number of atoms in a chunk
29 Int_t fSize; // Size of container, number of atoms
30 Int_t fVecSize; // Number of allocated chunks
31 Int_t fCapacity; // Available capacity within the chunks
33 std::vector<TArrayC*> fChunks; // Memory blocks
39 VoidCPlex(Int_t atom_size, Int_t chunk_size);
42 void Reset(Int_t atom_size, Int_t chunk_size);
45 Int_t S() const { return fS; }
46 Int_t N() const { return fN; }
48 Int_t Size() const { return fSize; }
49 Int_t VecSize() const { return fVecSize; }
50 Int_t Capacity() const { return fCapacity; }
52 Char_t* Atom(Int_t idx) const { return fChunks[idx/fN]->fArray + idx%fN*fS; }
53 Char_t* Chunk(Int_t chk) const { return fChunks[chk]->fArray; }
54 Int_t NAtoms(Int_t chk) const { return (chk < fVecSize-1) ? fN : (fSize-1)%fN + 1; }
70 iterator(VoidCPlex* p) :
71 fPlex(p), fCurrent(0), fAtomIndex(-1), fNextChunk(0), fAtomsToGo(0) {}
72 iterator(VoidCPlex& p) :
73 fPlex(&p), fCurrent(0), fAtomIndex(-1), fNextChunk(0), fAtomsToGo(0) {}
76 void reset() { fCurrent = 0; fNextChunk = fAtomsToGo = 0; }
78 Char_t* operator()() { return fCurrent; }
79 Char_t* operator*() { return fCurrent; }
80 Int_t index() { return fAtomIndex; }
83 ClassDef(VoidCPlex, 1); // Vector-like container with chunked memory allocation.
87 /******************************************************************************/
89 inline Char_t* VoidCPlex::NewAtom()
91 Char_t *a = (fSize >= fCapacity) ? NewChunk() : Atom(fSize);
96 inline Bool_t VoidCPlex::iterator::next()
98 if (fAtomsToGo <= 0) {
99 if (fNextChunk < fPlex->fVecSize) {
100 fCurrent = fPlex->Chunk(fNextChunk);
101 fAtomsToGo = fPlex->NAtoms(fNextChunk);
107 fCurrent += fPlex->fS;
115 /**************************************************************************/
116 // Templated some-class CPlex
117 /**************************************************************************/
120 class CPlex : public VoidCPlex
123 CPlex(const CPlex&); // Not implemented
124 CPlex& operator=(const CPlex&); // Not implemented
127 CPlex() : VoidCPlex() {}
128 CPlex(Int_t chunk_size) : VoidCPlex(sizeof(T), chunk_size) {}
131 void Reset(Int_t chunk_size) { Reset(sizeof(T), chunk_size); }
133 T* At(Int_t idx) { return reinterpret_cast<T*>(Atom(idx)); }
134 T& Ref(Int_t idx) { return *At(idx); }
136 ClassDef(CPlex, 1); // Templated class for specific atom classes (given as template argument).