ROOT logo
/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id: RooSetProxy.cxx 28259 2009-04-16 16:21:16Z wouter $
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/

//////////////////////////////////////////////////////////////////////////////
//
// BEGIN_HTML
// RooSetProxy is the concrete proxy for RooArgSet objects.
// A RooSetProxy is the general mechanism to store a RooArgSet
// with RooAbsArgs in a RooAbsArg.
//
// Creating a RooSetProxy adds all members of the proxied RooArgSet to the proxy owners
// server list (thus receiving value/shape dirty flags from it) and
// registers itself with the owning class. The latter allows the
// owning class to update the pointers of RooArgSet contents to reflect
// the serverRedirect changes.
// END_HTML
//


#include "RooFit.h"

#include "Riostream.h"
#include "RooSetProxy.h"
#include "RooSetProxy.h"
#include "RooArgSet.h"
#include "RooAbsArg.h"

ClassImp(RooSetProxy)
;


#ifdef USEMEMPOOL

//_____________________________________________________________________________
void* RooSetProxy::operator new (size_t bytes)
{
  // Overload new operator must be implemented because it is overloaded
  // in the RooArgSet base class. Perform standard memory allocation
  // here instead of memory pool management performed in RooArgSet

  return malloc(bytes) ;
}


//_____________________________________________________________________________
void RooSetProxy::operator delete (void* ptr)
{
  free(ptr) ;
}

#endif


//_____________________________________________________________________________
RooSetProxy::RooSetProxy(const char* inName, const char* /*desc*/, RooAbsArg* owner, 
			 Bool_t defValueServer, Bool_t defShapeServer) :
  RooArgSet(inName), _owner(owner), 
  _defValueServer(defValueServer), 
  _defShapeServer(defShapeServer)
{
  // Construct proxy with given name and description, with given owner
  // The default value and shape dirty propagation of the set contents
  // to the set owner is controlled by flags defValueServer and defShapeServer

  //SetTitle(desc) ;
  _owner->registerProxy(*this) ;
  _iter = createIterator() ;
}



//_____________________________________________________________________________
RooSetProxy::RooSetProxy(const char* inName, RooAbsArg* owner, const RooSetProxy& other) : 
  RooArgSet(other,inName), _owner(owner),  
  _defValueServer(other._defValueServer), 
  _defShapeServer(other._defShapeServer)
{
  // Copy constructor

  _owner->registerProxy(*this) ;
  _iter = createIterator() ;
}



//_____________________________________________________________________________
RooSetProxy::~RooSetProxy()
{
  // Destructor
  if (_owner) _owner->unRegisterProxy(*this) ;
  delete _iter ;
}



//_____________________________________________________________________________
Bool_t RooSetProxy::add(const RooAbsArg& var, Bool_t valueServer, Bool_t shapeServer, Bool_t silent)
{
  // Overloaded RooArgSet::add() method insert object into set 
  // and registers object as server to owner with given value
  // and shape dirty flag propagation requests

  Bool_t ret=RooArgSet::add(var,silent) ;
  if (ret) {
    _owner->addServer((RooAbsArg&)var,valueServer,shapeServer) ;
  }
  return ret ;  
}



//_____________________________________________________________________________
Bool_t RooSetProxy::addOwned(RooAbsArg& var, Bool_t silent)
{
  // Overloaded RooArgSet::addOwned() method insert object into owning set 
  // and registers object as server to owner with default value
  // and shape dirty flag propagation

  Bool_t ret=RooArgSet::addOwned(var,silent) ;
  if (ret) {
    _owner->addServer((RooAbsArg&)var,_defValueServer,_defShapeServer) ;
  }
  return ret ;  
}
				 


//_____________________________________________________________________________
RooAbsArg* RooSetProxy::addClone(const RooAbsArg& var, Bool_t silent) 
{
  // Overloaded RooArgSet::addClone() method insert clone of object into owning set 
  // and registers cloned object as server to owner with default value
  // and shape dirty flag propagation

  RooAbsArg* ret=RooArgSet::addClone(var,silent) ;
  if (ret) {
    _owner->addServer((RooAbsArg&)var,_defValueServer,_defShapeServer) ;
  }
  return ret ;
}



//_____________________________________________________________________________
Bool_t RooSetProxy::add(const RooAbsArg& var, Bool_t silent) 
{
  // Overloaded RooArgSet::add() method inserts 'var' into set
  // and registers 'var' as server to owner with default value
  // and shape dirty flag propagation

  return add(var,_defValueServer,_defShapeServer,silent) ;
}



//_____________________________________________________________________________
Bool_t RooSetProxy::replace(const RooAbsArg& var1, const RooAbsArg& var2) 
{
  // Replace object 'var1' in set with 'var2'. Deregister var1 as
  // server from owner and register var2 as server to owner with
  // default value and shape dirty propagation flags

  Bool_t ret=RooArgSet::replace(var1,var2) ;
  if (ret) {
    if (!isOwning()) _owner->removeServer((RooAbsArg&)var1) ;
    _owner->addServer((RooAbsArg&)var2,_owner->isValueServer(var1),
		                       _owner->isShapeServer(var2)) ;
  }
  return ret ;
}



//_____________________________________________________________________________
Bool_t RooSetProxy::remove(const RooAbsArg& var, Bool_t silent, Bool_t matchByNameOnly) 
{
  // Remove object 'var' from set and deregister 'var' as server to owner.

  Bool_t ret=RooArgSet::remove(var,silent,matchByNameOnly) ;
  if (ret && !isOwning()) {
    _owner->removeServer((RooAbsArg&)var) ;
  }
  return ret ;
}



//_____________________________________________________________________________
Bool_t RooSetProxy::remove(const RooAbsCollection& list, Bool_t silent, Bool_t matchByNameOnly) 
{
  // Remove each argument in the input list from our list using remove(const RooAbsArg&).
  // and remove each argument as server to owner

  Bool_t result(false) ;

  TIterator* iter = list.createIterator() ;
  RooAbsArg* arg ;
  while((arg=(RooAbsArg*)iter->Next())) {
    result |= remove(*arg,silent,matchByNameOnly) ;
  }
  delete iter ;

  return result;  
}




//_____________________________________________________________________________
void RooSetProxy::removeAll() 
{
  // Remove all argument inset using remove(const RooAbsArg&).
  // and remove each argument as server to owner

  if (!isOwning()) {
    TIterator* iter = createIterator() ;
    RooAbsArg* arg ;
    while ((arg=(RooAbsArg*)iter->Next())) {
      if (!isOwning()) {
	_owner->removeServer(*arg) ;
      }
    }
    delete iter ;
  }

  RooArgSet::removeAll() ;
}




//_____________________________________________________________________________
RooSetProxy& RooSetProxy::operator=(const RooArgSet& other) 
{
  // Assign values of arguments on other set to arguments in this set
  RooArgSet::operator=(other) ;
  return *this ;
}




//_____________________________________________________________________________
Bool_t RooSetProxy::changePointer(const RooAbsCollection& newServerList, Bool_t nameChange, Bool_t factoryInitMode) 
{
  // Process server change operation on owner. Replace elements in set with equally
  // named objects in 'newServerList'

  if (getSize()==0) {
    if (factoryInitMode) {
      TIterator* iter = newServerList.createIterator() ;
      RooAbsArg* arg ;
      while((arg=(RooAbsArg*)iter->Next())) {
	add(*arg,kTRUE) ;
      }
      delete iter ;
    } else {
      return kTRUE ;	
    }
  }

  _iter->Reset() ;
  RooAbsArg* arg ;
  Bool_t error(kFALSE) ;
  while ((arg=(RooAbsArg*)_iter->Next())) {
    
    RooAbsArg* newArg= arg->findNewServer(newServerList, nameChange);
    if (newArg) error |= !RooArgSet::replace(*arg,*newArg) ;
  }
  return !error ;
}



//_____________________________________________________________________________
void RooSetProxy::print(ostream& os, Bool_t addContents) const 
{ 
  // Printing name of proxy on ostream. If addContents is true
  // also print names of objects in set

  if (!addContents) {
    os << name() << "=" ; printStream(os,kValue,kInline) ; 
  } else {
    os << name() << "=(" ;
    TIterator* iter = createIterator() ;
    RooAbsArg* arg ;
    Bool_t first2(kTRUE) ;
    while ((arg=(RooAbsArg*)iter->Next())) {
      if (first2) {
	first2 = kFALSE ;
      } else {
	os << "," ;
      }
      arg->printStream(os,kValue|kName,kInline) ;
    }
    os << ")" ;
    delete iter ;
  }
}
 RooSetProxy.cxx:1
 RooSetProxy.cxx:2
 RooSetProxy.cxx:3
 RooSetProxy.cxx:4
 RooSetProxy.cxx:5
 RooSetProxy.cxx:6
 RooSetProxy.cxx:7
 RooSetProxy.cxx:8
 RooSetProxy.cxx:9
 RooSetProxy.cxx:10
 RooSetProxy.cxx:11
 RooSetProxy.cxx:12
 RooSetProxy.cxx:13
 RooSetProxy.cxx:14
 RooSetProxy.cxx:15
 RooSetProxy.cxx:16
 RooSetProxy.cxx:17
 RooSetProxy.cxx:18
 RooSetProxy.cxx:19
 RooSetProxy.cxx:20
 RooSetProxy.cxx:21
 RooSetProxy.cxx:22
 RooSetProxy.cxx:23
 RooSetProxy.cxx:24
 RooSetProxy.cxx:25
 RooSetProxy.cxx:26
 RooSetProxy.cxx:27
 RooSetProxy.cxx:28
 RooSetProxy.cxx:29
 RooSetProxy.cxx:30
 RooSetProxy.cxx:31
 RooSetProxy.cxx:32
 RooSetProxy.cxx:33
 RooSetProxy.cxx:34
 RooSetProxy.cxx:35
 RooSetProxy.cxx:36
 RooSetProxy.cxx:37
 RooSetProxy.cxx:38
 RooSetProxy.cxx:39
 RooSetProxy.cxx:40
 RooSetProxy.cxx:41
 RooSetProxy.cxx:42
 RooSetProxy.cxx:43
 RooSetProxy.cxx:44
 RooSetProxy.cxx:45
 RooSetProxy.cxx:46
 RooSetProxy.cxx:47
 RooSetProxy.cxx:48
 RooSetProxy.cxx:49
 RooSetProxy.cxx:50
 RooSetProxy.cxx:51
 RooSetProxy.cxx:52
 RooSetProxy.cxx:53
 RooSetProxy.cxx:54
 RooSetProxy.cxx:55
 RooSetProxy.cxx:56
 RooSetProxy.cxx:57
 RooSetProxy.cxx:58
 RooSetProxy.cxx:59
 RooSetProxy.cxx:60
 RooSetProxy.cxx:61
 RooSetProxy.cxx:62
 RooSetProxy.cxx:63
 RooSetProxy.cxx:64
 RooSetProxy.cxx:65
 RooSetProxy.cxx:66
 RooSetProxy.cxx:67
 RooSetProxy.cxx:68
 RooSetProxy.cxx:69
 RooSetProxy.cxx:70
 RooSetProxy.cxx:71
 RooSetProxy.cxx:72
 RooSetProxy.cxx:73
 RooSetProxy.cxx:74
 RooSetProxy.cxx:75
 RooSetProxy.cxx:76
 RooSetProxy.cxx:77
 RooSetProxy.cxx:78
 RooSetProxy.cxx:79
 RooSetProxy.cxx:80
 RooSetProxy.cxx:81
 RooSetProxy.cxx:82
 RooSetProxy.cxx:83
 RooSetProxy.cxx:84
 RooSetProxy.cxx:85
 RooSetProxy.cxx:86
 RooSetProxy.cxx:87
 RooSetProxy.cxx:88
 RooSetProxy.cxx:89
 RooSetProxy.cxx:90
 RooSetProxy.cxx:91
 RooSetProxy.cxx:92
 RooSetProxy.cxx:93
 RooSetProxy.cxx:94
 RooSetProxy.cxx:95
 RooSetProxy.cxx:96
 RooSetProxy.cxx:97
 RooSetProxy.cxx:98
 RooSetProxy.cxx:99
 RooSetProxy.cxx:100
 RooSetProxy.cxx:101
 RooSetProxy.cxx:102
 RooSetProxy.cxx:103
 RooSetProxy.cxx:104
 RooSetProxy.cxx:105
 RooSetProxy.cxx:106
 RooSetProxy.cxx:107
 RooSetProxy.cxx:108
 RooSetProxy.cxx:109
 RooSetProxy.cxx:110
 RooSetProxy.cxx:111
 RooSetProxy.cxx:112
 RooSetProxy.cxx:113
 RooSetProxy.cxx:114
 RooSetProxy.cxx:115
 RooSetProxy.cxx:116
 RooSetProxy.cxx:117
 RooSetProxy.cxx:118
 RooSetProxy.cxx:119
 RooSetProxy.cxx:120
 RooSetProxy.cxx:121
 RooSetProxy.cxx:122
 RooSetProxy.cxx:123
 RooSetProxy.cxx:124
 RooSetProxy.cxx:125
 RooSetProxy.cxx:126
 RooSetProxy.cxx:127
 RooSetProxy.cxx:128
 RooSetProxy.cxx:129
 RooSetProxy.cxx:130
 RooSetProxy.cxx:131
 RooSetProxy.cxx:132
 RooSetProxy.cxx:133
 RooSetProxy.cxx:134
 RooSetProxy.cxx:135
 RooSetProxy.cxx:136
 RooSetProxy.cxx:137
 RooSetProxy.cxx:138
 RooSetProxy.cxx:139
 RooSetProxy.cxx:140
 RooSetProxy.cxx:141
 RooSetProxy.cxx:142
 RooSetProxy.cxx:143
 RooSetProxy.cxx:144
 RooSetProxy.cxx:145
 RooSetProxy.cxx:146
 RooSetProxy.cxx:147
 RooSetProxy.cxx:148
 RooSetProxy.cxx:149
 RooSetProxy.cxx:150
 RooSetProxy.cxx:151
 RooSetProxy.cxx:152
 RooSetProxy.cxx:153
 RooSetProxy.cxx:154
 RooSetProxy.cxx:155
 RooSetProxy.cxx:156
 RooSetProxy.cxx:157
 RooSetProxy.cxx:158
 RooSetProxy.cxx:159
 RooSetProxy.cxx:160
 RooSetProxy.cxx:161
 RooSetProxy.cxx:162
 RooSetProxy.cxx:163
 RooSetProxy.cxx:164
 RooSetProxy.cxx:165
 RooSetProxy.cxx:166
 RooSetProxy.cxx:167
 RooSetProxy.cxx:168
 RooSetProxy.cxx:169
 RooSetProxy.cxx:170
 RooSetProxy.cxx:171
 RooSetProxy.cxx:172
 RooSetProxy.cxx:173
 RooSetProxy.cxx:174
 RooSetProxy.cxx:175
 RooSetProxy.cxx:176
 RooSetProxy.cxx:177
 RooSetProxy.cxx:178
 RooSetProxy.cxx:179
 RooSetProxy.cxx:180
 RooSetProxy.cxx:181
 RooSetProxy.cxx:182
 RooSetProxy.cxx:183
 RooSetProxy.cxx:184
 RooSetProxy.cxx:185
 RooSetProxy.cxx:186
 RooSetProxy.cxx:187
 RooSetProxy.cxx:188
 RooSetProxy.cxx:189
 RooSetProxy.cxx:190
 RooSetProxy.cxx:191
 RooSetProxy.cxx:192
 RooSetProxy.cxx:193
 RooSetProxy.cxx:194
 RooSetProxy.cxx:195
 RooSetProxy.cxx:196
 RooSetProxy.cxx:197
 RooSetProxy.cxx:198
 RooSetProxy.cxx:199
 RooSetProxy.cxx:200
 RooSetProxy.cxx:201
 RooSetProxy.cxx:202
 RooSetProxy.cxx:203
 RooSetProxy.cxx:204
 RooSetProxy.cxx:205
 RooSetProxy.cxx:206
 RooSetProxy.cxx:207
 RooSetProxy.cxx:208
 RooSetProxy.cxx:209
 RooSetProxy.cxx:210
 RooSetProxy.cxx:211
 RooSetProxy.cxx:212
 RooSetProxy.cxx:213
 RooSetProxy.cxx:214
 RooSetProxy.cxx:215
 RooSetProxy.cxx:216
 RooSetProxy.cxx:217
 RooSetProxy.cxx:218
 RooSetProxy.cxx:219
 RooSetProxy.cxx:220
 RooSetProxy.cxx:221
 RooSetProxy.cxx:222
 RooSetProxy.cxx:223
 RooSetProxy.cxx:224
 RooSetProxy.cxx:225
 RooSetProxy.cxx:226
 RooSetProxy.cxx:227
 RooSetProxy.cxx:228
 RooSetProxy.cxx:229
 RooSetProxy.cxx:230
 RooSetProxy.cxx:231
 RooSetProxy.cxx:232
 RooSetProxy.cxx:233
 RooSetProxy.cxx:234
 RooSetProxy.cxx:235
 RooSetProxy.cxx:236
 RooSetProxy.cxx:237
 RooSetProxy.cxx:238
 RooSetProxy.cxx:239
 RooSetProxy.cxx:240
 RooSetProxy.cxx:241
 RooSetProxy.cxx:242
 RooSetProxy.cxx:243
 RooSetProxy.cxx:244
 RooSetProxy.cxx:245
 RooSetProxy.cxx:246
 RooSetProxy.cxx:247
 RooSetProxy.cxx:248
 RooSetProxy.cxx:249
 RooSetProxy.cxx:250
 RooSetProxy.cxx:251
 RooSetProxy.cxx:252
 RooSetProxy.cxx:253
 RooSetProxy.cxx:254
 RooSetProxy.cxx:255
 RooSetProxy.cxx:256
 RooSetProxy.cxx:257
 RooSetProxy.cxx:258
 RooSetProxy.cxx:259
 RooSetProxy.cxx:260
 RooSetProxy.cxx:261
 RooSetProxy.cxx:262
 RooSetProxy.cxx:263
 RooSetProxy.cxx:264
 RooSetProxy.cxx:265
 RooSetProxy.cxx:266
 RooSetProxy.cxx:267
 RooSetProxy.cxx:268
 RooSetProxy.cxx:269
 RooSetProxy.cxx:270
 RooSetProxy.cxx:271
 RooSetProxy.cxx:272
 RooSetProxy.cxx:273
 RooSetProxy.cxx:274
 RooSetProxy.cxx:275
 RooSetProxy.cxx:276
 RooSetProxy.cxx:277
 RooSetProxy.cxx:278
 RooSetProxy.cxx:279
 RooSetProxy.cxx:280
 RooSetProxy.cxx:281
 RooSetProxy.cxx:282
 RooSetProxy.cxx:283
 RooSetProxy.cxx:284
 RooSetProxy.cxx:285
 RooSetProxy.cxx:286
 RooSetProxy.cxx:287
 RooSetProxy.cxx:288
 RooSetProxy.cxx:289
 RooSetProxy.cxx:290
 RooSetProxy.cxx:291
 RooSetProxy.cxx:292
 RooSetProxy.cxx:293
 RooSetProxy.cxx:294
 RooSetProxy.cxx:295
 RooSetProxy.cxx:296
 RooSetProxy.cxx:297
 RooSetProxy.cxx:298
 RooSetProxy.cxx:299
 RooSetProxy.cxx:300
 RooSetProxy.cxx:301
 RooSetProxy.cxx:302
 RooSetProxy.cxx:303
 RooSetProxy.cxx:304
 RooSetProxy.cxx:305
 RooSetProxy.cxx:306
 RooSetProxy.cxx:307
 RooSetProxy.cxx:308
 RooSetProxy.cxx:309
 RooSetProxy.cxx:310
 RooSetProxy.cxx:311
 RooSetProxy.cxx:312