00001 #ifndef __FACTORY_H__
00002 #define __FACTORY_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 namespace DLITE
00034 {
00035
00036
00037 class iIDGenerator;
00038 typedef _s_ptr<iIDGenerator> spiIDGenerator;
00039
00040 class iIDGenerator
00041 {
00042 public:
00043
00044
00045 virtual ~iIDGenerator() {}
00046
00047
00048 virtual operator_t NextUID() = 0;
00049 };
00050
00051
00052
00053 class tIDGenerator : public iIDGenerator
00054 {
00055 private:
00056
00057
00058 operator_t m_nId;
00059
00060 public:
00061
00062
00063 tIDGenerator(const operator_t i_nBase) : m_nId(i_nBase) {}
00064
00065
00066 operator_t NextUID() { return ++m_nId; }
00067
00068
00069 static const operator_t ms_nBase = 0x00800000;
00070
00071
00072 static spiIDGenerator Create(const operator_t i_nBase = ms_nBase)
00073 {
00074 spiIDGenerator sp = new tIDGenerator(i_nBase);
00075 return sp;
00076 }
00077 };
00078
00079
00080
00081 class tExprFactory
00082 {
00083 public:
00084
00085 typedef stack<_buffer<operator_t> > tArgStack;
00086
00087
00088 enum
00089 {
00090 err_fact_type = err_off_fact,
00091 err_fact_args,
00092 };
00093
00094
00095 private:
00096
00097 tArgStack m_oStack;
00098 spiIDGenerator m_spIdGen;
00099
00100 protected:
00101
00102
00103 void reset() {}
00104
00105
00106 operator_t nextId() { return m_spIdGen->NextUID(); }
00107
00108
00109 void role(const operator_t i_nType, const operator_t i_nRole);
00110
00111
00112 void andor(const operator_t i_nType);
00113
00114
00115 tExprFactory& assign(const tExprFactory& i_oSrc)
00116 {
00117 m_spIdGen = i_oSrc.m_spIdGen;
00118 return *this;
00119 }
00120
00121 public:
00122
00123
00124 tExprFactory(const spiIDGenerator& i_spIdGen = spiIDGenerator())
00125 {
00126 m_spIdGen = i_spIdGen.null() ? tIDGenerator::Create() : i_spIdGen;
00127 }
00128
00129
00130 tExprFactory(const tExprFactory& i_oSrc) { reset(); assign(i_oSrc); }
00131
00132
00133 ~tExprFactory() {}
00134
00135
00136 void clear() { m_oStack = tArgStack(); }
00137
00138
00139 void concept(const operator_t i_nCpt);
00140
00141
00142 void top();
00143
00144
00145 void bottom();
00146
00147
00148 void univ(const operator_t i_nRole);
00149
00150
00151 void exist(const operator_t i_nRole);
00152
00153
00154 void andop();
00155
00156
00157 void orop();
00158
00159
00160 void neg();
00161
00162
00163 sptExpression expr() const;
00164 operator sptExpression() const { return expr(); }
00165
00166
00167 tExprFactory& operator=(tExprFactory& i_oSrc) { clear(); return assign(i_oSrc); }
00168 };
00169 }
00170
00171 #endif //_FACTORY_H