source: trunk/Mars/mdata/MDataMember.cc @ 19351

Last change on this file since 19351 was 19351, checked in by tbretz, 7 months ago
This fixed a problem with old gcc -- we might have to extend the range of the fix.
File size: 7.2 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18!   Author(s): Thomas Bretz  04/2002 <mailto:tbretz@astro.uni-wuerzburg.de>
19!
20!   Copyright: MAGIC Software Development, 2000-2004
21!
22!
23\* ======================================================================== */
24
25/////////////////////////////////////////////////////////////////////////////
26//
27//   MDataMember
28//
29//   This objects corresponds to the data member of another object.
30//   You can either specify the object as a string, eg "MHillas.fWidth"
31//   where MHillas is the name of the container in the parameterlist
32//   and fWidth is it's data member, or you can specify it by giving
33//   the pointer corresponding to the instance of your object and
34//   a TMethodCall pointer corresponding to the Member function returning
35//   the requested value.
36//
37/////////////////////////////////////////////////////////////////////////////
38#include "MDataMember.h"
39
40#include <fstream>
41
42#include <TMethodCall.h>
43
44#include "MLog.h"
45#include "MLogManip.h"
46
47#include "MParList.h"
48
49ClassImp(MDataMember);
50
51using namespace std;
52
53// --------------------------------------------------------------------------
54//
55//  obj is a pointer to the instance of your class from which the data
56//  should be requested. TMethodCall (s. root dox) is a pointer
57//  to a TMethodCall object which should be the getter function for
58//  the data you want to get.
59//
60MDataMember::MDataMember(MParContainer *obj, TMethodCall *call)
61{
62    fObject = obj;
63    fCall   = call;
64
65    if (fCall->ReturnType()==TMethodCall::kLong)
66        SetBit(kIsInt);
67    else
68        ResetBit(kIsInt);
69
70    fDataMember = (TString)obj->GetName() + "." + call->GetName();
71}
72
73// --------------------------------------------------------------------------
74//
75//  obj is a pointer to the instance of your class from which the data
76//  should be requested. TMethodCall (s. root dox) is a pointer
77//  to a TMethodCall object which should be the getter function for
78//  the data you want to get.
79//
80MDataMember::MDataMember(MParContainer *obj, const TString call)
81{
82    fObject = obj;
83    fCall   = obj->GetterMethod(call);
84
85    if (fCall->ReturnType()==TMethodCall::kLong)
86        SetBit(kIsInt);
87    else
88        ResetBit(kIsInt);
89
90    fDataMember = (TString)obj->GetName() + "." + call;
91}
92
93// --------------------------------------------------------------------------
94//
95// Check if accessing fCall is safe
96//
97Bool_t MDataMember::CheckGet() const
98{
99    if (!fObject)
100    {
101        *fLog << err << "ERROR - MDataMember::Get: fObject not initialized ";
102        *fLog << "(not PreProcessed)... returning 0." << endl;
103        return kFALSE;
104    }
105
106    if (!fCall)
107    {
108        *fLog << err << "ERROR - MDataMemberGet: No TMethodCall for " << fDataMember << " of ";
109        *fLog << fObject->GetName() << " available... returning 0." << endl;
110        return kFALSE;
111    }
112
113    return kTRUE;
114}
115
116// --------------------------------------------------------------------------
117//
118// Returns the value you requested
119//
120Double_t MDataMember::GetValue() const
121{
122    if (!CheckGet())
123        return 0;
124
125    switch (fCall->ReturnType())
126    {
127    case TMethodCall::kLong:
128        Long_t l;
129        fCall->Execute(fObject, l);
130        return (Double_t)l;
131
132    case TMethodCall::kDouble:
133        Double_t v;
134        fCall->Execute(fObject, v);
135        return v;
136
137    default:
138        *fLog << err << "ERROR - MDataMember::GetValue: " << fObject->GetName();
139        *fLog << "." << fDataMember << " has unkown type (=";
140#if ROOT_VERSION_CODE < ROOT_VERSION(6,00,00) || (!defined(__clang__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 5))
141        *fLog << fCall->ReturnType() << ")... returning 0." << endl;
142#else
143
144        *fLog << static_cast<underlying_type<TInterpreter::EReturnType>::type>(fCall->ReturnType());
145#endif
146        *fLog << ")... returning 0." << endl;
147        return 0;
148    }
149}
150
151// --------------------------------------------------------------------------
152//
153// Returns the string you requested
154//
155const char *MDataMember::GetString() const
156{
157    if (!CheckGet())
158        return NULL;
159
160    switch (fCall->ReturnType())
161    {
162    case TMethodCall::kString:
163        {
164            char *c=NULL;
165            fCall->Execute(fObject, &c);
166            return c;
167        }
168
169    default:
170        *fLog << err << "DataMember " << fDataMember << " of ";
171        *fLog << fObject->GetName() << " not a char*... returning NULL." << endl;
172        return NULL;
173    }
174}
175
176// --------------------------------------------------------------------------
177//
178// If a string was given PreProcess try to resolv the object name and
179// tries to get it from the parlist. And also tries to resolve
180// the data member (variable) name you requested and tries to get a
181// corresponding TMethodCall from the root Dictionary.
182// Remark: If your Data Member is called fDataMember the corresponding
183//         getter Method in your class must be calles fDataMember
184//
185Bool_t MDataMember::PreProcess(const MParList *plist)
186{
187    // The following change has to be checked :
188    // In order that fCall is initialized properly
189    // the original statement "if (fCall)" is replaced by the statement
190    if (fCall && !fObject)
191        return kTRUE;
192
193    TString cname(fDataMember);
194    TString mname(fDataMember);
195
196    const char *dot = strrchr(cname, '.');
197
198    if (dot)
199    {
200        const int pos = dot-cname;
201
202        cname.Remove(pos);
203        mname.Remove(0, pos+1);
204    }
205
206    fObject = (MParContainer*)plist->FindObject(cname);
207    if (!fObject)
208    {
209        *fLog << err << "Object '" << cname << "' not in parameter list... aborting." << endl;
210        return kFALSE;
211    }
212
213    fCall = fObject->GetterMethod(mname);
214
215    return fCall ? kTRUE : kFALSE;
216}
217
218// --------------------------------------------------------------------------
219//
220// Returns the ready-to-save flag of the data member container
221//
222Bool_t MDataMember::IsReadyToSave() const
223{
224    return IsValid() ? fObject->IsReadyToSave() : kFALSE;
225}
226
227// --------------------------------------------------------------------------
228//
229// Print the name of the data member without an CR.
230//
231/*
232void MDataMember::Print(Option_t *opt) const
233{
234    *fLog << fName << flush;
235}
236*/
237
238// --------------------------------------------------------------------------
239//
240// Builds a rule which can be used in a MDataPhrase to describe this object
241//
242TString MDataMember::GetRule() const
243{
244    return fDataMember;
245}
246
247// --------------------------------------------------------------------------
248//
249// Returns the data member.
250// This is mainly used in MTask::AddToBranchList
251//
252TString MDataMember::GetDataMember() const
253{
254    return fDataMember;
255}
Note: See TracBrowser for help on using the repository browser.