00001 #ifndef __EXPRESSION_H__
00002 #define __EXPRESSION_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
00042 namespace DLITE
00043 {
00044
00045
00046 typedef dword operator_t;
00047
00048
00049 #define OP_INVALID ((dword) 0x00) // Invalid
00050 #define OP_ONTOLOGY ((dword) 0x01) // Ontology
00051 #define OP_NAMESPACE ((dword) 0x02) // Namespace
00052 #define OP_DEFINITION ((dword) 0x03) // Concept definition
00053 #define OP_GCI ((dword) 0x04) // Global concept inclusion
00054 #define OP_INDIVIDUAL ((dword) 0x05) // Individual
00055 #define OP_CONCEPT ((dword) 0x06) // Concept
00056 #define OP_CONCEPTNEG ((dword) 0x07) // Concept neg
00057 #define OP_ROLE ((dword) 0x08) // Role
00058 #define OP_ROLENEG ((dword) 0x09) // Role neg
00059 #define OP_TOP ((dword) 0x0A) // Top
00060 #define OP_BOTTOM ((dword) 0x0B) // Bottom
00061 #define OP_UNIV ((dword) 0x0C) // Universal
00062 #define OP_EXIST ((dword) 0x0D) // Exitential
00063 #define OP_UNION ((dword) 0x0E) // Or
00064 #define OP_INTER ((dword) 0x0F) // And
00065 #define OP_MAX ((dword) 0x10) // Max type val
00066
00067
00068 struct tOperatorDef
00069 {
00070 dword type;
00071 dword mask;
00072 };
00073
00074
00075 extern tOperatorDef g_asOp[];
00076
00077
00078 #define OP_DEF(TYPE, MASK) { TYPE << 24, MASK << 24 }
00079 #define OP_TYPE_MASK ((dword) 0xFF000000)
00080 #define OP_IDNT_MASK ((dword) 0x00FFFFFF)
00081 #define OP_TYPE(OP) ((OP) >> 24)
00082 #define OP_IDNT(OP) ((OP) & OP_IDNT_MASK)
00083 #define OP_VALID(OP) (((OP) & OP_TYPE_MASK) && ((OP) < (OP_MAX << 24))
00084 #define OP_NEG(OP) ((OP) ^ g_asOp[OP_TYPE(OP)].mask)
00085 #define OP_ABS(OP) ((OP) & ~(g_asOp[OP_TYPE(OP)].mask))
00086 #define OP_ABS_TYPE(OP) (OP_TYPE(OP_ABS(OP)))
00087 #define OP_MAKE(TYPE, IDNT) (((TYPE) << 24) + (IDNT))
00088
00089 #define OP_CMPL_MASK ((dword) 0x01000000)
00090 #define OP_CMPL_NEG(OP) ((OP) ^ OP_CMPL_MASK)
00091 #define OP_CMPL_ABS(OP) ((OP) & (~OP_CMPL_MASK))
00092 #define OP_CMPL_FLG(OP) ((OP) & (OP_CMPL_MASK))
00093
00094 #define OP_HDR_SZ (2)
00095
00096
00097 #define OP_ROOT_NS (OP_MAKE(OP_NAMESPACE, 0))
00098
00099
00100
00101 class tOperator
00102 {
00103 public:
00104
00105
00106 enum
00107 {
00108 err_op_size = err_off_op,
00109 };
00110
00111 private:
00112
00113 bool m_fNeg;
00114 dword m_dwSize;
00115 pdword m_pdwOp;
00116 dword m_nOffset;
00117
00118 protected:
00119
00120
00121 inline static dword sizeOf(const pdword i_pdwOp) { return *(i_pdwOp + 1) + OP_HDR_SZ; }
00122
00123 public:
00124
00125
00126 tOperator()
00127 : m_fNeg(false), m_dwSize(0), m_pdwOp(NULL), m_nOffset(0) {}
00128 tOperator(const pdword i_pdwOp, const bool i_fNeg = false)
00129 : m_fNeg(i_fNeg), m_dwSize(sizeOf(i_pdwOp)), m_pdwOp(i_pdwOp), m_nOffset(OP_HDR_SZ) {}
00130 tOperator(const tOperator& i_oSrc)
00131 : m_fNeg(i_oSrc.m_fNeg), m_dwSize(i_oSrc.m_dwSize), m_pdwOp(i_oSrc.m_pdwOp), m_nOffset(OP_HDR_SZ) {}
00132
00133
00134 inline bool null() const { return (m_pdwOp == NULL); }
00135
00136
00137 operator_t op() const { return m_fNeg ? OP_NEG(*m_pdwOp) : *m_pdwOp; }
00138
00139
00140 inline dword size() const { return m_dwSize; }
00141
00142
00143 inline dword type() const { return OP_TYPE(op()); }
00144
00145
00146 void neg() { *m_pdwOp = OP_NEG(*m_pdwOp); }
00147
00148
00149 void begin()
00150 {
00151 m_nOffset = OP_HDR_SZ;
00152 }
00153
00154
00155 inline bool end() const { return m_nOffset >= m_dwSize; }
00156
00157
00158 bool last() const
00159 {
00160 if (end()) return true;
00161
00162 return (m_nOffset + sizeOf(m_pdwOp + m_nOffset)) >= m_dwSize;
00163 }
00164
00165
00166 inline tOperator cur() const
00167 {
00168 return end() ? tOperator() : tOperator(m_pdwOp + m_nOffset);
00169 }
00170
00171
00172 tOperator next()
00173 {
00174 tOperator op = cur();
00175 m_nOffset += op.size();
00176
00177 return op;
00178 }
00179 };
00180
00181
00182
00183
00184 class tExpression;
00185 typedef _s_ptr<tExpression> sptExpression;
00186
00187 class tExpression
00188 {
00189 public:
00190
00191
00192 enum
00193 {
00194 err_expr_size = err_off_expr,
00195 };
00196
00197 private:
00198
00199 _buffer<operator_t> m_oExpr;
00200
00201 protected:
00202
00203
00204 void reset()
00205 {
00206
00207 }
00208
00209
00210 tExpression& assign(const _buffer<byte>& i_oBlob)
00211 {
00212 size_t nSrcSz = i_oBlob.size();
00213 _check(!(nSrcSz % 4), err_expr_size);
00214
00215 size_t nDesSz = nSrcSz / sizeof(dword);
00216
00217 m_oExpr.set(nDesSz);
00218
00219 pbyte pSrc = i_oBlob.ptr();
00220 pdword pDes = m_oExpr.ptr();
00221
00222 for(size_t i = 0; i < nDesSz; i ++)
00223 {
00224 dword nCur = *(pSrc ++);
00225 nCur = (nCur << 8) | *(pSrc ++);
00226 nCur = (nCur << 8) | *(pSrc ++);
00227 nCur = (nCur << 8) | *(pSrc ++);
00228 *(pDes ++) = nCur;
00229 }
00230
00231 return *this;
00232 }
00233
00234 public:
00235
00236
00237 void clear()
00238 {
00239 reset();
00240 }
00241
00242
00243 tExpression(const _buffer<byte>& i_oBlob) { reset(); assign(i_oBlob); }
00244
00245
00246 tExpression(const _buffer<operator_t>& i_oExpr) { reset(); m_oExpr = i_oExpr; }
00247
00248
00249 virtual ~tExpression() { clear(); }
00250
00251
00252 const _buffer<operator_t>& buffer() const { return m_oExpr; }
00253
00254
00255 tOperator root(const bool i_fNeg = false) const
00256 {
00257 if (m_oExpr.null())
00258 {
00259 return tOperator();
00260 }
00261 else
00262 {
00263 _check(m_oExpr.size() >= OP_HDR_SZ, err_expr_size);
00264 tOperator op(m_oExpr.ptr(), i_fNeg);
00265 _check(m_oExpr.size() == op.size(), err_expr_size);
00266
00267 return op;
00268 }
00269 }
00270
00271
00272 _buffer<byte> serialize() const
00273 {
00274 _buffer<byte> oBuf;
00275 if (!m_oExpr.null())
00276 {
00277 size_t nSize = m_oExpr.size() * sizeof(operator_t);
00278 oBuf.set(nSize);
00279 pdword p = m_oExpr.end();
00280 pbyte q = oBuf.end();
00281
00282 dword cur = 0;
00283 for(size_t i = 0; i < nSize; i ++)
00284 {
00285 if (!(i % sizeof(operator_t))) cur = *(-- p);
00286 *(-- q) = (byte) (cur & 0xFF);
00287 cur >>= 8;
00288 }
00289 }
00290
00291 return oBuf;
00292 }
00293
00294
00295 void depend(set<operator_t>& o_oDep)
00296 {
00297 o_oDep.clear();
00298 if (!m_oExpr.null())
00299 {
00300 size_t nSize = m_oExpr.size();
00301 pdword p = m_oExpr.ptr();
00302 for(size_t i = 0; i < nSize; i ++, p ++)
00303 {
00304 operator_t op = OP_ABS(*p);
00305 if (OP_TYPE(op) == OP_CONCEPT) o_oDep.insert(op);
00306 }
00307 }
00308 }
00309
00310
00311 static sptExpression Create(const _buffer<byte>& i_oBlob)
00312 {
00313 return sptExpression(new tExpression(i_oBlob));
00314 }
00315
00316
00317 static sptExpression Create(const _buffer<operator_t>& i_oExpr)
00318 {
00319 return sptExpression(new tExpression(i_oExpr));
00320 }
00321 };
00322 }
00323
00324 #endif //__EXPRESSION_H__