File indexing completed on 2025-09-16 08:55:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef GAUDI_NTUPLESVC_NTUPLEITEMS_H
0015 #define GAUDI_NTUPLESVC_NTUPLEITEMS_H 1
0016
0017
0018 #define ALLOW_ALL_TYPES
0019
0020
0021 #include <vector>
0022
0023
0024 #include "NTuple.h"
0025 #include <GaudiKernel/System.h>
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 class IDataProviderSvc;
0039 class IConversionSvc;
0040
0041 namespace NTuple {
0042
0043 template <class TYP>
0044 class DataItem;
0045 template <class TYP>
0046 class _DataImp;
0047 template <class TYP>
0048 class _ItemImp;
0049 template <class TYP>
0050 class _ArrayImp;
0051 template <class TYP>
0052 class _MatrixImp;
0053
0054
0055
0056 template <class TYP>
0057 class _DataImp : virtual public _Data<TYP> {
0058
0059 _DataImp( const _DataImp& ) = delete;
0060
0061 protected:
0062 typedef const std::string& CSTR;
0063 typedef const std::type_info& CTYPE;
0064
0065 long m_length;
0066
0067 INTuple* m_tuple;
0068
0069 std::string m_name;
0070
0071 std::string m_index;
0072
0073 mutable INTupleItem* m_indexItem = nullptr;
0074
0075 DataTypeInfo::Type m_type;
0076
0077 TYP m_def;
0078
0079 Range<TYP> m_range;
0080
0081 const std::type_info& m_info;
0082
0083 public:
0084
0085 typedef Range<TYP> ItemRange;
0086
0087 _DataImp( INTuple* tup, std::string name, const std::type_info& info, std::string index, long len, TYP low,
0088 TYP high, TYP def )
0089 : m_length( len )
0090 , m_tuple( tup )
0091 , m_name( std::move( name ) )
0092 , m_index( std::move( index ) )
0093 , m_def( std::move( def ) )
0094 , m_range( std::move( low ), std::move( high ) )
0095 , m_info( info ) {
0096 m_type = typeid( TYP ) == typeid( void* ) ? DataTypeInfo::POINTER : DataTypeInfo::ID( info );
0097 this->m_buffer = new TYP[m_length];
0098 reset();
0099 }
0100
0101 ~_DataImp() override { delete[] this->m_buffer; }
0102
0103 std::string typeName() const override { return System::typeinfoName( this->typeID() ); }
0104
0105 void reset() override { std::fill_n( this->m_buffer, m_length, m_def ); }
0106
0107 long filled() const override {
0108 long len = 1;
0109 long nd = ndim();
0110 if ( m_length > 1 ) {
0111 for ( int l = 0; l < nd - 1; l++ ) { len *= dim( l ); }
0112 if ( indexItem() ) {
0113 long* ll = (long*)m_indexItem->buffer();
0114 len *= *ll;
0115 } else if ( nd > 0 ) {
0116 len *= dim( nd - 1 );
0117 }
0118 }
0119 return len;
0120 }
0121
0122 INTupleItem* indexItem() override {
0123 if ( !m_indexItem ) m_indexItem = m_tuple->find( m_index );
0124 return m_indexItem;
0125 }
0126
0127 const INTupleItem* indexItem() const override {
0128 if ( !m_indexItem ) m_indexItem = m_tuple->find( m_index );
0129 return m_indexItem;
0130 }
0131
0132 const std::type_info& typeID() const override { return m_info; }
0133
0134 long size() const override { return m_length * sizeof( TYP ); }
0135
0136 void release() override { delete this; }
0137
0138 bool hasIndex() const override { return m_index.length() > 0; }
0139
0140 const std::string& index() const override { return m_index; }
0141
0142 const std::string& name() const override { return m_name; }
0143
0144 long type() const override { return m_type; }
0145
0146 void setType( long t ) override { m_type = DataTypeInfo::Type( t ); }
0147
0148 void setDefault( const TYP val ) override { m_def = val; }
0149
0150 const ItemRange& range() const override { return m_range; }
0151
0152 long length() const override { return m_length; }
0153
0154 const void* buffer() const override { return this->m_buffer; }
0155
0156 virtual void* buffer() { return this->m_buffer; }
0157
0158 long ndim() const override { return 0; }
0159
0160 long dim( long i ) const override { return ( i == 0 ) ? 1 : 0; }
0161
0162 INTuple* tuple() override { return m_tuple; }
0163 };
0164
0165
0166
0167 template <class TYP>
0168 class _ItemImp : virtual public _DataImp<TYP>, virtual public _Item<TYP> {
0169
0170 public:
0171
0172 typedef Range<TYP> ItemRange;
0173
0174 _ItemImp( INTuple* tup, const std::string& name, const std::type_info& info, TYP min, TYP max, TYP def )
0175 : _DataImp<TYP>( tup, name, info, "", 1, min, max, def ) {}
0176
0177
0178
0179 void setDefault( const TYP val ) override { this->m_def = val; }
0180
0181 const ItemRange& range() const override { return this->m_range; }
0182
0183 long size() const override { return this->m_length * sizeof( TYP ); }
0184 };
0185
0186
0187
0188 template <class TYP>
0189 class _ArrayImp : virtual public _DataImp<TYP>, virtual public _Array<TYP> {
0190 public:
0191
0192 typedef Range<TYP> ItemRange;
0193
0194 _ArrayImp( INTuple* tup, const std::string& name, const std::type_info& typ, const std::string& index, long len,
0195 TYP min, TYP max, TYP def )
0196 : _DataImp<TYP>( tup, name, typ, index, len, min, max, def ) {}
0197
0198
0199
0200 void setDefault( const TYP val ) override { this->m_def = val; }
0201
0202 const ItemRange& range() const override { return this->m_range; }
0203
0204 long size() const override { return this->m_length * sizeof( TYP ); }
0205
0206 long ndim() const override { return 1; }
0207
0208 long dim( long i ) const override { return ( i != 0 || this->hasIndex() ) ? 0 : this->m_length; }
0209 };
0210
0211
0212
0213 template <class TYP>
0214 class _MatrixImp : virtual public _DataImp<TYP>, virtual public _Matrix<TYP> {
0215 public:
0216
0217 typedef Range<TYP> ItemRange;
0218
0219 _MatrixImp( INTuple* tup, const std::string& name, const std::type_info& typ, const std::string& index, long ncol,
0220 long nrow, TYP min, TYP max, TYP def )
0221 : _DataImp<TYP>( tup, name, typ, index, nrow * ncol, min, max, def ) {
0222 this->m_rows = nrow;
0223 }
0224
0225
0226
0227 void setDefault( const TYP val ) override { this->m_def = val; }
0228
0229 const ItemRange& range() const override { return this->m_range; }
0230
0231 long size() const override { return this->m_length * sizeof( TYP ); }
0232
0233 long ndim() const override { return 2; }
0234
0235 long dim( long i ) const override {
0236 return ( this->hasIndex() ) ? ( ( i == 0 ) ? this->m_rows : this->m_length / this->m_rows )
0237 : ( ( i == 1 ) ? this->m_length / this->m_rows : this->m_rows );
0238 }
0239 };
0240 }
0241 #endif