1 // $Id: RandBit.h,v 1.5 2010/06/16 17:24:53 garren Exp $
2 // -*- C++ -*-
3 //
4 // -----------------------------------------------------------------------
5 //                             HEP Random
6 //                           --- RandBit ---
7 //                          class header file
8 // -----------------------------------------------------------------------
9 //
10 
11 // Class defining methods for shooting Flat or Bit random numbers, double or
12 // integers.
13 // It provides methods to fill with double flat values arrays of
14 // specified size, as well as methods for shooting sequences of 0,1 (bits).
15 // Default boundaries ]0.1[ for operator()().
16 
17 // This is derived from RandFlat and is a drop-in replacement.  However
18 // the shootBit() and fireBit() methods are stateless (which makes them
19 // an order of magnitude slower, but allows save/restore engine status
20 // to work correctly).
21 
22 // =======================================================================
23 // M. Fischler    - Created: 15th Feb 2000
24 // M Fischler      - put and get to/from streams 12/10/04
25 // M Fischler      - static save/restore to streams streams 12/20/04
26 // =======================================================================
27 
28 #ifndef RandBit_h
29 #define RandBit_h 1
30 
31 #include "CLHEP/Random/defs.h"
32 #include "CLHEP/Random/RandFlat.h"
33 
34 namespace CLHEP {
35 
36 /**
37  * @author
38  * @ingroup random
39  */
40 class RandBit : public RandFlat {
41 
42 public:
43 
44   inline RandBit ( HepRandomEngine& anEngine );
45   inline RandBit ( HepRandomEngine& anEngine, double width );
46   inline RandBit ( HepRandomEngine& anEngine, double a, double b );
47   inline RandBit ( HepRandomEngine* anEngine );
48   inline RandBit ( HepRandomEngine* anEngine, double width );
49   inline RandBit ( HepRandomEngine* anEngine, double a, double b );
50   // These constructors should be used to instantiate a RandBit
51   // distribution object defining a local engine for it.
52   // The static generator will be skipped using the non-static methods
53   // defined below.
54   // If the engine is passed by pointer the corresponding engine object
55   // will be deleted by the RandBit destructor.
56   // If the engine is passed by reference the corresponding engine object
57   // will not be deleted by the RandBit destructor.
58 
59   virtual ~RandBit();
60   // Destructor
61 
62   // Other than the Bit routines, constructors, and destructor, everything is
63   // simply inherited from RandFlat.
64 
65   static  inline int shootBit();
66 
67   static  inline int shootBit( HepRandomEngine* );
68 
69   //  Methods using the localEngine to shoot random values, by-passing
70   //  the static generator.
71 
72   inline int fireBit();
73 
74   // Save and restore to/from streams
75 
76   std::ostream & put ( std::ostream & os ) const;
77   std::istream & get ( std::istream & is );
78 
79   std::string name() const;
80 
distributionName()81   static std::string distributionName() {return "RandBit";}
82   // Provides the name of this distribution class
83 
saveFullState(std::ostream & os)84   static std::ostream& saveFullState ( std::ostream & os )
85   // Saves to stream the state of the engine and cached data.
86   					{return RandFlat::saveFullState(os);}
87 
restoreFullState(std::istream & is)88   static std::istream& restoreFullState ( std::istream & is )
89   // Restores from stream the state of the engine and cached data.
90   					{return RandFlat::restoreFullState(is);}
91 
saveDistState(std::ostream & os)92   static std::ostream& saveDistState ( std::ostream & os )
93   // Saves to stream the state of the cached data.
94   					{return RandFlat::saveDistState(os);}
95 
restoreDistState(std::istream & is)96   static std::istream& restoreDistState ( std::istream & is )
97   // Restores from stream the state of the cached data.
98   					{return RandFlat::restoreDistState(is);}
99 
100 
101 private:
102 
103   // All the engine info, and the default A and B, are in the RandFlat
104   // base class.
105 
106 };
107 
108 }  // namespace CLHEP
109 
110 #ifdef ENABLE_BACKWARDS_COMPATIBILITY
111 //  backwards compatibility will be enabled ONLY in CLHEP 1.9
112 using namespace CLHEP;
113 #endif
114 
115 #include "CLHEP/Random/RandBit.icc"
116 
117 #endif
118