/usr/include/ThePEG/Interface/InterfacedBase.h is in libthepeg-dev 1.8.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 | // -*- C++ -*-
//
// InterfacedBase.h is a part of ThePEG - Toolkit for HEP Event Generation
// Copyright (C) 1999-2011 Leif Lonnblad
//
// ThePEG is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
#ifndef ThePEG_InterfacedBase_H
#define ThePEG_InterfacedBase_H
// This is the declaration of the InterfacedBase class.
#include "ThePEG/Config/ThePEG.h"
#include "ThePEG/Utilities/Named.h"
#include "ThePEG/Utilities/ClassDescription.h"
#include "ThePEG/Utilities/HoldFlag.h"
#include "InterfacedBase.xh"
namespace ThePEG {
/**
* InterfacedBase is the base class of all Interfaced objects to be
* handled by the BaseRepository class. InterfacedBase
* objects can be manipulated through objects of the InterfaceBase
* class dealing with setting parameters, switches and pointers to
* other InterfacedBase objects.
*
* The InterfacedBase has a number of virtual methods to be
* implemented by sub classes for checking the state of the object,
* initializing the object etc.
*
* The InterfacedBase is derived from the PersistentBase class to
* allow for persistent I/O, and from the Named for handling the name
* of the object. The full name of the object is of the form
* <code>/dir/subdir/name</code> analogous to the file name in a Unix
* file system.
*
* It is possible to lock an InterfacedBase object in which case the
* BaseRepository will not do anything that will change the state of
* this object.
*
* @see BaseRepository
* @see InterfaceBase
*/
class InterfacedBase: public PersistentBase, public Named {
/** The BaseRepository is a close friend. */
friend class BaseRepository;
/** The InterfaceBase is a close friend. */
friend class InterfaceBase;
/** The EventGenerator is a friend. */
friend class EventGenerator;
public:
/**
* Enumeration reflecting the state of an InterfacedBase object.
*/
enum InitState {
initializing = -1, /**< The object is currently being
initialized. I.e. either of update(),
init(), initrun() or finish() are being
run. */
uninitialized = 0, /**< The object has not been initialized. */
initialized = 1, /**< The object has been initialized. */
runready = 2 /**< The object is initialized and the
initrun() method has been called. */
};
public:
/**
* The virtual (empty) destructor;
*/
virtual ~InterfacedBase();
/**
* Returns the full name of this object including its path, e.g.
* <code>/directory/subdirectory/name</code>.
*/
string fullName() const { return Named::name(); }
/**
* Returns the name of this object, without the path.
*/
string name() const {
return Named::name().substr(Named::name().rfind('/')+1);
}
/**
* Returns the path to this object including the trailing
* '/'. <code>fullName() = path() + name()</code>.
*/
string path() const {
string::size_type slash = Named::name().rfind('/');
string ret;
if ( slash != string::npos ) ret = Named::name().substr(0,slash);
return ret;
}
/**
* Returns a comment assigned to this object.
*/
string comment() const { return theComment; }
/**
* Read setup info from a standard istream \a is. May be called by
* the Repository to initialize an object. This function first calls
* the virtual readSetup() function to allow the sub classes the
* part \a is to initialize themselves. What ever is left in \a is
* after that will be assigned to the comment() of the object.
*/
void setup(istream & is) {
readSetup(is);
getline(is, theComment);
}
protected:
/** @name Standard InterfacedBase virtual functions. */
//@{
/**
* Read setup info from a standard istream \a is. May be called by
* the Repository to initialize an object. This function is called
* by the non virtual setup() function. A sub-class implementing it
* should first call the base class version before parsing the \a
* is. If the \a is is not empty after readSetup is called the
* remaining string will be assigned to the comment() of the object.
*/
virtual void readSetup(istream & is);
/**
* Check sanity of the object during the setup phase. This function
* is called everytime the object is changed through an interface
* during the setup phase. Also if the setup is changed for an
* object on which this is dependent. Note that the generator() is
* not available when this method is called.
*
* This method may be called by the user interface during the setup phase
* through the update() method after manipulating objects to check
* the sanity of the object. When implemented by a sub class it is
* important that the doupdate() method of the base class is called,
* then if the sanity of this object depend on other objects, the
* update() method of these should be called. Then if touched() is
* true for this object or for the ones on which this depends, it is
* an indication that some things have changed since last time
* doupdate() was called, and the actual checking of the state of
* this object is called for. To avoid circular loops, it is
* important that the doupdate() method is called for the base
* class, while the update() method is called for other objects.
* @throws UpdateException if the setup is such that the object
* would not work properly.
*/
virtual void doupdate() {}
/**
* Initialize this object after the setup phase before saving an
* EventGenerator to disk. Nothing should have changed since the
* last update() call.
*
* This method is called after the setup
* phase through the init() method to indicate that the setup of a
* run is finished. This is typpically done in a setup program
* before this object has been saved to a run file. It must
* therefore be made sure that the state of this object after this
* method has been executed will not be changed if it is written to
* a file and read in again. When implemented by a sub class it is
* important that the doinit() method of the base class is called
* first and then, if the initialization of this object depends on
* other objects, that the init() method of these objects are
* called. Only then should the class-local initialization
* proceed. To avoid circular loops, it is important that the
* doinit() method is called for the base class, while the init()
* method is called for other objects.
* @throws InitException if object could not be initialized properly.
*/
virtual void doinit() {}
/**
* Initialize this object. Called in the run phase just before
* a run begins.
*
* This method is called just before
* running starts through the initrun() method to indicate that the
* actual running is to start. When implemented by a sub class it is
* important that the doinitrun() method of the base class is called
* first and then, if the initialization of this object depends on
* other objects, that the initrun() method of these objects are
* called. Only then should the class-local initialization
* proceed. To avoid circular loops, it is important that the
* doinitrun() method is called for the base class, while the
* initrun() method is called for other objects.
*/
virtual void doinitrun() {}
/**
* Finalize this object. Called in the run phase just after a
* run has ended. Used eg. to write out statistics.
*
* This method is called after the running
* phase through the finish() and can eg. be used to write out
* statistics. When implemented by a sub class it is important that
* the dofinish() method of the base class is called while the
* finish() methd is called for other objects.
*/
virtual void dofinish() {}
/**
* Return a vector of all pointers to Interfaced objects used in this
* object.
* @return a vector of pointers.
*/
virtual IVector getReferences() { return IVector(); }
/**
* Rebind pointer to other Interfaced objects. Called in the setup phase
* after all objects used in an EventGenerator has been cloned so that
* the pointers will refer to the cloned objects afterwards.
* @throws RebindException if no cloned object was found for a given
* pointer.
*/
virtual void rebind(const TranslationMap &) {}
//@}
public:
/** @name Inlined access function. */
//@{
/**
* Calls the doupdate() function with recursion prevention.
*/
void update() {
if ( initState ) return;
HoldFlag<InitState> hold(initState, initializing, initialized);
doupdate();
}
/**
* Calls the doinit() function with recursion prevention.
*/
void init() {
if ( initState ) return;
HoldFlag<InitState> hold(initState, initializing, initialized);
doinit();
}
/**
* Return true if this object needs to be initialized before all
* other objects (except those for which this function also returns
* true). This default version always returns false, but subclasses
* may override it to return true.
*/
virtual bool preInitialize() const;
/**
* Calls the doinitrun() function with recursion prevention.
*/
void initrun() {
if ( initState == runready || initState == initializing ) return;
HoldFlag<InitState> hold(initState, initializing, runready);
doinitrun();
}
/**
* Calls the dofinish() function with recursion prevention.
*/
void finish() {
if ( initState == uninitialized || initState == initializing ) return;
HoldFlag<InitState> hold(initState, initializing, uninitialized);
dofinish();
}
/**
* This function should be called every time something in this
* object has changed in a way that a sanity check with update() is
* needed
*/
void touch() { isTouched = true; }
/**
* Set the state of this object to uninitialized.
*/
void reset() { initState = uninitialized; }
/**
* Calls reset() and unTouch().
*/
void clear() {
reset();
untouch();
}
/**
* Return the state of initialization of this object.
*/
InitState state() const { return initState; }
/**
* Return true if the BaseRepository is not allowed to change the
* state of this object.
*/
bool locked() const { return isLocked; }
/**
* Return true if the state of this object has been changed since
* the last call to update().
*/
bool touched() const { return isTouched; }
//@}
/**
* Return a full clone of this object possibly doing things to the
* clone to make it sane.
*/
virtual IBPtr fullclone() const { return clone(); }
/** @name Functions used by the persistent I/O system. */
//@{
/**
* Function used to write out object persistently.
* @param os the persistent output stream written to.
*/
void persistentOutput(PersistentOStream & os) const;
/**
* Function used to read in object persistently.
* @param is the persistent input stream read from.
* @param version the version number of the object when written.
*/
void persistentInput(PersistentIStream & is, int version);
//@}
/**
* Standard Init function.
*/
static void Init();
protected:
/**
* Return a simple clone of this object. Should be implemented as
* <code>return new_ptr(*this);</code> by a derived class.
*/
virtual IBPtr clone() const = 0;
/**
* Protected default constructor.
*/
InterfacedBase()
: Named(""), isLocked(false), isTouched(true),
initState(uninitialized) {}
/**
* Protected constructor with the name given as argument.
*/
InterfacedBase(string newName)
: Named(newName), isLocked(false), isTouched(true),
initState(uninitialized) {}
/**
* Protected copy-constructor.
*/
InterfacedBase(const InterfacedBase & i)
: Base(i), Named(i), isLocked(false), isTouched(true),
initState(uninitialized), theComment(i.theComment),
objectDefaults(i.objectDefaults) {}
private:
/**
* Set a new name (full name including path).
*/
void name(string newName) { Named::name(newName); }
/**
* Lock this object.
*/
void lock() { isLocked = true; }
/**
* Unlock this object.
*/
void unlock() { isLocked = false; }
/**
* Clear the isTouched flag.
*/
void untouch() { isTouched = false; }
private:
/**
* Used by the interface to add comments.
*/
string addComment(string);
private:
/**
* True if this object is not to be changed by the user interface.
*/
bool isLocked;
/**
* True if this object has been chaged since the last call to
* update().
*/
bool isTouched;
/**
* Indicate if this object has been initialized or not, or if it is
* being initialized.
*/
InitState initState;
/**
* A comment assigned to this object.
*/
string theComment;
/**
* A map listing object-specific defaults set for the given interfaces.
*/
map<string,string> objectDefaults;
public:
/**
* Print out debugging information for this object on std::cerr. To
* be called from within a debugger via the debug() function.
*/
virtual void debugme() const;
private:
/**
* Standard Initialization object.
*/
static AbstractClassDescription<InterfacedBase> initInterfacedBase;
/**
* Private and non-existent assignment operator.
*/
InterfacedBase & operator=(const InterfacedBase &);
protected:
/**
* Functor class to be used to update a range of dependent object.
*/
struct UpdateChecker {
/** Constructor. */
UpdateChecker(bool & touched) : isTouched(touched) {}
/** Constructor. */
UpdateChecker(const UpdateChecker & uc) : isTouched(uc.isTouched) {}
/** Call the check function for an object. */
static void check(tIBPtr, bool &);
/** Function call operator. */
template <typename ptr> void operator()(const ptr & i) {
check(i, isTouched);
}
/** set to false if any check() call fails. */
bool & isTouched;
};
/**
* Functor class to be used to update a range of dependent object in a map.
*/
struct UpdateMapChecker {
/** Constructor. */
UpdateMapChecker(bool & touched) : isTouched(touched) {}
/** Constructor. */
UpdateMapChecker(const UpdateMapChecker & uc) : isTouched(uc.isTouched) {}
/** Function call operator. */
template <typename ref> void operator()(const ref & i) {
UpdateChecker::check(i.second, isTouched);
}
/** Reference to the bool variable to be set. */
bool & isTouched;
};
};
/** @cond TRAITSPECIALIZATIONS */
/**
* This template specialization informs ThePEG about the
* base class of InterfacedBase.
*/
template <>
struct BaseClassTrait<InterfacedBase,1>: public ClassTraitsType {
/** Typedef of the base class of InterfacedBase. */
typedef PersistentBase NthBase;
};
/**
* This template specialization informs ThePEG about the name of the
* InterfacedBase class.
*/
template <>
struct ClassTraits<InterfacedBase>: public ClassTraitsBase<InterfacedBase> {
/** Return the class name. */
static string className() { return "ThePEG::InterfacedBase"; }
};
/** @endcond */
}
#endif /* ThePEG_InterfacedBase_H */
|