/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 * @(#)root/roofitcore:$Id$
 * 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
// RooRealConstant provides static functions to create and keep track
// of RooRealVar constants. Instead of creating such constants by
// hand (e.g. RooRealVar one("one","one",1)), simply use
// <pre>
//  RooRealConstant::value(1.0)
// </pre>
// whenever a reference to RooRealVar with constant value 1.0 is needed.
// RooRealConstant keeps an internal database of previously created
// RooRealVar objects and will recycle them as appropriate.
// END_HTML
//

#include "RooFit.h"

#include <math.h>
#include <sstream>
#include "RooRealConstant.h"
#include "RooRealConstant.h"
#include "RooConstVar.h"
#include "RooArgList.h"
#include "RooSentinel.h"

using namespace std;

ClassImp(RooRealConstant)
;


RooArgList* RooRealConstant::_constDB = 0;
TIterator* RooRealConstant::_constDBIter = 0;



//_____________________________________________________________________________
void RooRealConstant::cleanup() 
{
  // Cleanup function register with RooSentinel for cleanup in atexit()
  if (_constDB) {
    delete _constDB ;
    delete _constDBIter ;
    _constDB = 0 ;
  }
}



//_____________________________________________________________________________
RooConstVar& RooRealConstant::value(Double_t value) 
{
  // Return a constant value object with given value.
  // Return previously created object if available,
  // otherwise create a new one on the fly.
  
  // Lookup existing constant
  init() ;
  RooConstVar* var ;
  while((var=(RooConstVar*)_constDBIter->Next())) {
    if ((var->getVal()==value) && (!var->getAttribute("REMOVAL_DUMMY"))) return *var ;
  }

  // Create new constant
  std::ostringstream s ;
  s << value ;  

  var = new RooConstVar(s.str().c_str(),s.str().c_str(),value) ;
  var->setAttribute("RooRealConstant_Factory_Object",kTRUE) ;
  _constDB->addOwned(*var) ;

  return *var ;
}


//_____________________________________________________________________________
RooConstVar& RooRealConstant::removalDummy() 
{
  // Create a dummy node used in node-removal operations
  
  RooConstVar* var = new RooConstVar("REMOVAL_DUMMY","REMOVAL_DUMMY",1) ;
  var->setAttribute("RooRealConstant_Factory_Object",kTRUE) ;
  var->setAttribute("REMOVAL_DUMMY") ;
  _constDB->addOwned(*var) ;

  return *var ;
}



//_____________________________________________________________________________
void RooRealConstant::init() 
{
  // One-time initialization of constants database

  if (!_constDB) {
    _constDB = new RooArgList("RooRealVar Constants Database") ;
    _constDBIter = _constDB->createIterator() ;
    RooSentinel::activate() ;
  } else {
    _constDBIter->Reset() ;
  }
}
 RooRealConstant.cxx:1
 RooRealConstant.cxx:2
 RooRealConstant.cxx:3
 RooRealConstant.cxx:4
 RooRealConstant.cxx:5
 RooRealConstant.cxx:6
 RooRealConstant.cxx:7
 RooRealConstant.cxx:8
 RooRealConstant.cxx:9
 RooRealConstant.cxx:10
 RooRealConstant.cxx:11
 RooRealConstant.cxx:12
 RooRealConstant.cxx:13
 RooRealConstant.cxx:14
 RooRealConstant.cxx:15
 RooRealConstant.cxx:16
 RooRealConstant.cxx:17
 RooRealConstant.cxx:18
 RooRealConstant.cxx:19
 RooRealConstant.cxx:20
 RooRealConstant.cxx:21
 RooRealConstant.cxx:22
 RooRealConstant.cxx:23
 RooRealConstant.cxx:24
 RooRealConstant.cxx:25
 RooRealConstant.cxx:26
 RooRealConstant.cxx:27
 RooRealConstant.cxx:28
 RooRealConstant.cxx:29
 RooRealConstant.cxx:30
 RooRealConstant.cxx:31
 RooRealConstant.cxx:32
 RooRealConstant.cxx:33
 RooRealConstant.cxx:34
 RooRealConstant.cxx:35
 RooRealConstant.cxx:36
 RooRealConstant.cxx:37
 RooRealConstant.cxx:38
 RooRealConstant.cxx:39
 RooRealConstant.cxx:40
 RooRealConstant.cxx:41
 RooRealConstant.cxx:42
 RooRealConstant.cxx:43
 RooRealConstant.cxx:44
 RooRealConstant.cxx:45
 RooRealConstant.cxx:46
 RooRealConstant.cxx:47
 RooRealConstant.cxx:48
 RooRealConstant.cxx:49
 RooRealConstant.cxx:50
 RooRealConstant.cxx:51
 RooRealConstant.cxx:52
 RooRealConstant.cxx:53
 RooRealConstant.cxx:54
 RooRealConstant.cxx:55
 RooRealConstant.cxx:56
 RooRealConstant.cxx:57
 RooRealConstant.cxx:58
 RooRealConstant.cxx:59
 RooRealConstant.cxx:60
 RooRealConstant.cxx:61
 RooRealConstant.cxx:62
 RooRealConstant.cxx:63
 RooRealConstant.cxx:64
 RooRealConstant.cxx:65
 RooRealConstant.cxx:66
 RooRealConstant.cxx:67
 RooRealConstant.cxx:68
 RooRealConstant.cxx:69
 RooRealConstant.cxx:70
 RooRealConstant.cxx:71
 RooRealConstant.cxx:72
 RooRealConstant.cxx:73
 RooRealConstant.cxx:74
 RooRealConstant.cxx:75
 RooRealConstant.cxx:76
 RooRealConstant.cxx:77
 RooRealConstant.cxx:78
 RooRealConstant.cxx:79
 RooRealConstant.cxx:80
 RooRealConstant.cxx:81
 RooRealConstant.cxx:82
 RooRealConstant.cxx:83
 RooRealConstant.cxx:84
 RooRealConstant.cxx:85
 RooRealConstant.cxx:86
 RooRealConstant.cxx:87
 RooRealConstant.cxx:88
 RooRealConstant.cxx:89
 RooRealConstant.cxx:90
 RooRealConstant.cxx:91
 RooRealConstant.cxx:92
 RooRealConstant.cxx:93
 RooRealConstant.cxx:94
 RooRealConstant.cxx:95
 RooRealConstant.cxx:96
 RooRealConstant.cxx:97
 RooRealConstant.cxx:98
 RooRealConstant.cxx:99
 RooRealConstant.cxx:100
 RooRealConstant.cxx:101
 RooRealConstant.cxx:102
 RooRealConstant.cxx:103
 RooRealConstant.cxx:104
 RooRealConstant.cxx:105
 RooRealConstant.cxx:106
 RooRealConstant.cxx:107
 RooRealConstant.cxx:108
 RooRealConstant.cxx:109
 RooRealConstant.cxx:110
 RooRealConstant.cxx:111
 RooRealConstant.cxx:112
 RooRealConstant.cxx:113
 RooRealConstant.cxx:114
 RooRealConstant.cxx:115
 RooRealConstant.cxx:116
 RooRealConstant.cxx:117
 RooRealConstant.cxx:118
 RooRealConstant.cxx:119