00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _ANYATOMICTYPE_HPP
00023 #define _ANYATOMICTYPE_HPP
00024
00025 #include <xqilla/framework/XQillaExport.hpp>
00026 #include <xqilla/items/Item.hpp>
00027 #include <xercesc/util/XercesDefs.hpp>
00028
00029 class DynamicContext;
00030 class StaticContext;
00031
00032 class XQILLA_API AnyAtomicType: public Item
00033 {
00034
00035 public:
00036 enum AtomicObjectType {
00037 ANY_SIMPLE_TYPE = 0,
00038 ANY_URI = 1,
00039 BASE_64_BINARY = 2,
00040 BOOLEAN = 3,
00041 DATE = 4,
00042 DATE_TIME = 5,
00043 DAY_TIME_DURATION = 6,
00044 DECIMAL = 7,
00045 DOUBLE = 8,
00046 DURATION = 9,
00047 FLOAT = 10,
00048 G_DAY = 11,
00049 G_MONTH = 12,
00050 G_MONTH_DAY = 13,
00051 G_YEAR = 14,
00052 G_YEAR_MONTH = 15,
00053 HEX_BINARY = 16,
00054 NOTATION = 17,
00055 QNAME = 18,
00056 STRING = 19,
00057 TIME = 20,
00058 UNTYPED_ATOMIC = 21,
00059 YEAR_MONTH_DURATION= 22,
00060 NumAtomicObjectTypes= 23
00061 };
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 typedef RefCountPointer<const AnyAtomicType> Ptr;
00092
00093
00094 virtual bool isAtomicValue() const;
00095
00096
00097 virtual bool isNode() const;
00098
00099
00100 virtual bool isNumericValue() const;
00101
00102
00103 virtual bool isDateOrTimeTypeValue() const;
00104
00105
00106 virtual const XMLCh* getPrimitiveTypeURI() const;
00107
00108
00109 virtual const XMLCh* getPrimitiveTypeName() const = 0;
00110
00111
00112 virtual const XMLCh* getTypeURI() const = 0;
00113
00114
00115 virtual const XMLCh* getTypeName() const = 0;
00116
00117
00118 AnyAtomicType::Ptr castAs(AtomicObjectType targetIndex, const DynamicContext* context) const;
00119
00120
00121 AnyAtomicType::Ptr castAsNoCheck(AtomicObjectType targetIndex, const XMLCh* targetURI, const XMLCh* targetType,
00122 const DynamicContext* context) const;
00123
00124
00125 AnyAtomicType::Ptr castAs(AtomicObjectType targetIndex, const XMLCh* targetURI, const XMLCh* targetType,
00126 const DynamicContext* context) const;
00127
00128
00129 virtual bool castable(AtomicObjectType targetIndex, const XMLCh* targetURI, const XMLCh* targetType,
00130 const DynamicContext* context) const;
00131
00132
00133 virtual const XMLCh* asString(const DynamicContext* context) const = 0;
00134
00135
00136
00137 virtual bool equals(const AnyAtomicType::Ptr &target, const DynamicContext* context) const = 0;
00138
00139
00140 virtual bool isOfType(const XMLCh* targetURI, const XMLCh* targetType, const DynamicContext* context) const;
00141
00142
00143
00144 virtual bool isInstanceOfType(const XMLCh* targetURI, const XMLCh* targetType, const StaticContext* context) const;
00145
00158 bool castIsSupported(AtomicObjectType targetIndex, const DynamicContext* context) const;
00159
00160 virtual AtomicObjectType getPrimitiveTypeIndex() const = 0;
00161
00162 static const XMLCh fgDT_ANYATOMICTYPE[];
00163
00164 protected:
00165
00166 virtual AnyAtomicType::Ptr castAsInternal(AtomicObjectType targetIndex, const XMLCh* targetURI,
00167 const XMLCh* targetType, const DynamicContext* context) const;
00168
00169 private:
00170
00171
00172
00173
00174
00175 class CastTable {
00176 public:
00177 CastTable();
00178 bool getCell(AtomicObjectType source,
00179 AtomicObjectType target) const;
00180 private:
00181 bool staticCastTable[NumAtomicObjectTypes][NumAtomicObjectTypes];
00182 };
00183
00184
00185
00186 static const CastTable staticCastTable;
00187 };
00188
00189 #endif // _ANYATOMICTYPE_HPP