00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_HoldFlag_H
00010 #define ThePEG_HoldFlag_H
00011
00012
00013 namespace ThePEG {
00014
00015 template <typename T = bool>
00023 class HoldFlag {
00024
00025 public:
00026
00032 HoldFlag(T & newFlag, const T & holdFlag)
00033 : theFlag(newFlag), oldFlag(holdFlag) { std::swap(theFlag, oldFlag); }
00034
00042 HoldFlag(T & newFlag, const T & holdFlag, const T & finalFlag)
00043 : theFlag(newFlag), oldFlag(holdFlag)
00044 {
00045 std::swap(theFlag, oldFlag);
00046 oldFlag = finalFlag;
00047 }
00048
00053 ~HoldFlag() { std::swap(theFlag, oldFlag); }
00054
00055 private:
00056
00060 T & theFlag;
00061
00065 T oldFlag;
00066
00070 HoldFlag();
00071
00075 HoldFlag(const HoldFlag &);
00076
00080 HoldFlag & operator=(const HoldFlag &);
00081
00082 };
00083
00087 template <>
00088 class HoldFlag<bool> {
00089
00090 public:
00091
00097 HoldFlag(bool & newFlag, bool holdFlag = true)
00098 : theFlag(newFlag), oldFlag(newFlag) { theFlag = holdFlag; }
00099
00107 HoldFlag(bool & newFlag, bool holdFlag, bool finalFlag)
00108 : theFlag(newFlag), oldFlag(finalFlag) { theFlag = holdFlag; }
00109
00114 ~HoldFlag() { theFlag = oldFlag; }
00115
00116 private:
00117
00121 bool & theFlag;
00122
00126 bool oldFlag;
00127
00131 HoldFlag();
00132
00136 HoldFlag(const HoldFlag &);
00137
00141 HoldFlag & operator=(const HoldFlag &);
00142
00143 };
00144
00145 }
00146
00147 #endif