00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_EnumIO_H
00010 #define ThePEG_EnumIO_H
00011
00012
00013
00014
00015
00016
00017
00018 namespace ThePEG {
00019
00020 template <typename T>
00030 struct OEnum {
00031
00033 OEnum(const T & t): theT(t) {}
00034
00036 OEnum(const OEnum & oe): theT(oe.theT) {}
00037
00039 const T & theT;
00040
00041 };
00042
00052 template <typename T>
00053 struct IEnum {
00054
00056 IEnum(T & t): theT(t) {}
00057
00059 IEnum(const IEnum & ie): theT(ie.theT) {}
00060
00062 T & theT;
00063
00064 };
00065
00067 template <typename T>
00068 inline OEnum<T> oenum(const T & t) {
00069 return OEnum<T>(t);
00070 }
00071
00073 template <typename T>
00074 inline IEnum<T> ienum(T & t) {
00075 return IEnum<T>(t);
00076 }
00077
00079 template <typename OStream, typename T>
00080 OStream & operator<<(OStream & os, const OEnum<T> & e) {
00081 os << long(e.theT);
00082 return os;
00083 }
00084
00086 template <typename IStream, typename T>
00087 IStream & operator>>(IStream & is, const IEnum<T> & e) {
00088 long l = 0;
00089 is >> l;
00090 e.theT = T(l);
00091 return is;
00092 }
00093
00094 }
00095
00096 #endif