ROOT logo
// @(#)root/base:$Id: TParameter.h 40272 2011-07-18 11:12:14Z rdm $
// Author: Maarten Ballintijn   21/06/2004

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TParameter
#define ROOT_TParameter


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TParameter<AParamType>                                               //
//                                                                      //
// Named parameter, streamable and storable.                            //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_Riostream
#include "Riostream.h"
#endif

#ifndef ROOT_TClass
#include "TClass.h"
#endif

#ifndef ROOT_TObject
#include "TObject.h"
#endif

#ifndef ROOT_TCollection
#include "TCollection.h"
#endif

#ifndef ROOT_TString
#include "TString.h"
#endif

#ifndef ROOT_TROOT
#include "TROOT.h"
#endif

template <class AParamType>
class TParameter : public TObject {

public:
   enum EStatusBits { kMultiply = BIT(16) }; // Use multiplication while merging

private:
   TString     fName;
   AParamType  fVal;

public:
   TParameter() { /* leave fVal uninitialized */ }
   TParameter(const char *name, const AParamType &val)
             : fName(name), fVal(val) { ResetBit(kMultiply); }
   TParameter(const char *name, const AParamType &val, char mergemode)
             : fName(name), fVal(val) { SetMergeMode(mergemode); }
   ~TParameter() { }

   const char       *GetName() const { return fName; }
   const AParamType &GetVal() const { return fVal; }
   void              SetVal(const AParamType &val) { fVal = val; }
   void              SetMergeMode(char mergemode = '+') { ResetBit(kMultiply);
                                                          if (mergemode == '*') SetBit(kMultiply); }

   virtual ULong_t  Hash() const { return fName.Hash(); }
   virtual Bool_t   IsSortable() const { return kTRUE; }
   virtual Int_t    Compare(const TObject *obj) const {
      // Compare two TParameter objects. Returns 0 when equal, -1 when this is
      // smaller and +1 when bigger (like strcmp).
      
      if (this == obj) return 0;
      return fName.CompareTo(obj->GetName());
   }

   virtual void ls(Option_t *) const {
      // Print this parameter content
      TROOT::IndentLevel();
      cout << "OBJ: " << IsA()->GetName() << "\t" << fName << " = " << fVal << endl;
   }

   virtual void Print(Option_t *) const {
      // Print this parameter content
      TROOT::IndentLevel();
      cout << IsA()->GetName() << "\t" << fName << " = " << fVal << endl;
   }

   virtual Int_t Merge(TCollection *in);
   
   ClassDef(TParameter,2)  //Named templated parameter type
};

template <class AParamType>
inline Int_t TParameter<AParamType>::Merge(TCollection *in) {
   // Merge objects in the list.
   // Returns the number of objects that were in the list.
   TIter nxo(in);
   Int_t n = 0;
   while (TObject *o = nxo()) {
      TParameter<AParamType> *c = dynamic_cast<TParameter<AParamType> *>(o);
      if (c) {
         if (TestBit(kMultiply))
            fVal *= c->GetVal();
         else
            fVal += c->GetVal();
         n++;
      }
   }
   
   return n;
}

// Specialization of Merge for Bool_t  
template <>
inline Int_t TParameter<Bool_t>::Merge(TCollection *in)
{
   // Merge bool objects in the list.
   // Returns the number of objects that were in the list.
   TIter nxo(in);
   Int_t n = 0;
   while (TObject *o = nxo()) {
      TParameter<Bool_t> *c = dynamic_cast<TParameter<Bool_t> *>(o);
      if (c) {
         if (TestBit(TParameter::kMultiply))
            fVal &= (Bool_t) c->GetVal();
         else
            fVal |= (Bool_t) c->GetVal();
         n++;
      }
   }
   
   return n;
}

#endif
 TParameter.h:1
 TParameter.h:2
 TParameter.h:3
 TParameter.h:4
 TParameter.h:5
 TParameter.h:6
 TParameter.h:7
 TParameter.h:8
 TParameter.h:9
 TParameter.h:10
 TParameter.h:11
 TParameter.h:12
 TParameter.h:13
 TParameter.h:14
 TParameter.h:15
 TParameter.h:16
 TParameter.h:17
 TParameter.h:18
 TParameter.h:19
 TParameter.h:20
 TParameter.h:21
 TParameter.h:22
 TParameter.h:23
 TParameter.h:24
 TParameter.h:25
 TParameter.h:26
 TParameter.h:27
 TParameter.h:28
 TParameter.h:29
 TParameter.h:30
 TParameter.h:31
 TParameter.h:32
 TParameter.h:33
 TParameter.h:34
 TParameter.h:35
 TParameter.h:36
 TParameter.h:37
 TParameter.h:38
 TParameter.h:39
 TParameter.h:40
 TParameter.h:41
 TParameter.h:42
 TParameter.h:43
 TParameter.h:44
 TParameter.h:45
 TParameter.h:46
 TParameter.h:47
 TParameter.h:48
 TParameter.h:49
 TParameter.h:50
 TParameter.h:51
 TParameter.h:52
 TParameter.h:53
 TParameter.h:54
 TParameter.h:55
 TParameter.h:56
 TParameter.h:57
 TParameter.h:58
 TParameter.h:59
 TParameter.h:60
 TParameter.h:61
 TParameter.h:62
 TParameter.h:63
 TParameter.h:64
 TParameter.h:65
 TParameter.h:66
 TParameter.h:67
 TParameter.h:68
 TParameter.h:69
 TParameter.h:70
 TParameter.h:71
 TParameter.h:72
 TParameter.h:73
 TParameter.h:74
 TParameter.h:75
 TParameter.h:76
 TParameter.h:77
 TParameter.h:78
 TParameter.h:79
 TParameter.h:80
 TParameter.h:81
 TParameter.h:82
 TParameter.h:83
 TParameter.h:84
 TParameter.h:85
 TParameter.h:86
 TParameter.h:87
 TParameter.h:88
 TParameter.h:89
 TParameter.h:90
 TParameter.h:91
 TParameter.h:92
 TParameter.h:93
 TParameter.h:94
 TParameter.h:95
 TParameter.h:96
 TParameter.h:97
 TParameter.h:98
 TParameter.h:99
 TParameter.h:100
 TParameter.h:101
 TParameter.h:102
 TParameter.h:103
 TParameter.h:104
 TParameter.h:105
 TParameter.h:106
 TParameter.h:107
 TParameter.h:108
 TParameter.h:109
 TParameter.h:110
 TParameter.h:111
 TParameter.h:112
 TParameter.h:113
 TParameter.h:114
 TParameter.h:115
 TParameter.h:116
 TParameter.h:117
 TParameter.h:118
 TParameter.h:119
 TParameter.h:120
 TParameter.h:121
 TParameter.h:122
 TParameter.h:123
 TParameter.h:124
 TParameter.h:125
 TParameter.h:126
 TParameter.h:127
 TParameter.h:128
 TParameter.h:129
 TParameter.h:130
 TParameter.h:131
 TParameter.h:132
 TParameter.h:133
 TParameter.h:134
 TParameter.h:135
 TParameter.h:136
 TParameter.h:137
 TParameter.h:138
 TParameter.h:139
 TParameter.h:140
 TParameter.h:141