/usr/include/ThePEG/Utilities/LoopGuard.h is in libthepeg-dev 1.8.0-3build1.
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 | // -*- C++ -*-
//
// LoopGuard.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_LoopGuard_H
#define ThePEG_LoopGuard_H
// This is the declaration of the LoopGuard class.
namespace ThePEG {
/**
* A LoopGuard object can be used to throw an exception if a loop is
* iterated too many times. It is used by constructing an object
* before the loop giving the maximum number of iterations allowed and
* a message to be used as argument to the constructor of the
* exception to be thrown. Inside the loop the parenthesis is called
* without argument, which will increment and check an internal counter.
*
*
* @see Level
*/
template <typename ExceptionT = Exception,
typename MessageT = const char *>
class LoopGuard {
public:
/**
* Create a loop guard object which will throw an exception of type
* ExceptionT, constructed with 'mess' as argument, if the maximum
* number of iterations is exceeded.
*/
LoopGuard(const MessageT & mess, long maxc = 1000000 )
: count(0), maxCount(maxc), message(mess) {}
/**
* Increase the iteration count and throw an ExceptionT if the
* maximum number of iterations is exceeded.
*/
void operator()()
{
if ( ++count > maxCount ) throw ExceptionT(message);
}
private:
/**
* The number of counts so far.
*/
long count;
/**
* The maximum number of counts allowed.
*/
long maxCount;
/**
* The message with which the thrown ExceptionT object will be
* initialized.
*/
const MessageT & message;
private:
/**
* Default constructor is private and not implemented.
*/
LoopGuard();
/**
* Copy constructor is private and not implemented.
*/
LoopGuard(const LoopGuard &);
};
/**
* A LoopGuard object can be used to throw an exception if a loop is
* iterated too many times. It is used by constructing an object
* before the loop giving the maximum number of iterations allowed and
* a message to be used as argument to the constructor of the
* exception to be thrown. Inside the loop the parenthesis is called
* without argument, which will increment and check an internal
* counter. This specialization is for the case where the exception
* class cannot be created with a message.
*
*
* @see Level
*/
template <typename ExceptionT>
class LoopGuard<ExceptionT,void> {
public:
/**
* Create a loop guard object which will throw an exception of type
* ExceptionT, constructed with 'mess' as argument, if the maximum
* number of iterations is exceeded.
*/
LoopGuard(long maxc = 1000000 )
: count(0), maxCount(maxc) {}
/**
* Increase the iteration count and throw an ExceptionT if the
* maximum number of iterations is exceeded.
*/
void operator()()
{
if ( ++count > maxCount ) throw ExceptionT();
}
private:
/**
* The number of counts so far.
*/
long count;
/**
* The maximum number of counts allowed.
*/
long maxCount;
private:
/**
* Default constructor is private and not implemented.
*/
LoopGuard();
/**
* Copy constructor is private and not implemented.
*/
LoopGuard(const LoopGuard &);
};
}
#endif /* ThePEG_LoopGuard_H */
|