00001 #ifndef _READONLYCOLLECTION_H_
00002 #define _READONLYCOLLECTION_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef _WIN32
00023 #pragma once
00024 #endif
00025 #include <FdoStd.h>
00026
00027
00028
00029
00030 template <class OBJ, class BASE, class EXC> class FdoReadOnlyCollection : public FdoIDisposable
00031 {
00032 protected:
00033 FDO_API FdoReadOnlyCollection()
00034 {
00035 }
00036
00037 FDO_API virtual ~FdoReadOnlyCollection()
00038 {
00039 FDO_SAFE_RELEASE(m_base);
00040 }
00041
00042 void SetBaseCollection(BASE* base)
00043 {
00044 FDO_SAFE_ADDREF(base);
00045 m_base = base;
00046 }
00047
00048 public:
00049
00050
00051
00052
00053
00054
00055 FDO_API virtual FdoInt32 GetCount()
00056 {
00057 if (m_base)
00058 return m_base->GetCount();
00059 else
00060 return 0;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 FDO_API virtual OBJ* GetItem(FdoInt32 index)
00073 {
00074 if (m_base)
00075 return (OBJ*)m_base->GetItem(index);
00076 else
00077 throw EXC::Create(FdoException::NLSGetMessage(FDO_NLSID(FDO_1_INDEXOUTOFBOUNDS)));
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 FDO_API virtual OBJ* GetItem(FdoString* name)
00090 {
00091 if (name == NULL)
00092 throw EXC::Create(FdoException::NLSGetMessage(FDO_NLSID(FDO_1_BADPARAMETER)));
00093
00094 FdoInt32 size = GetCount();
00095 for (FdoInt32 i = 0; i < size; i++)
00096 {
00097 OBJ* pitem = GetItem(i);
00098 if (pitem != NULL && pitem->GetName() != NULL && wcscmp(name, pitem->GetName()) == 0)
00099 return pitem;
00100 FDO_SAFE_RELEASE(pitem);
00101 }
00102 throw EXC::Create(FdoException::NLSGetMessage(FDO_NLSID(SCHEMA_5_INVALIDELEMENTNAME)));
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 FDO_API virtual bool Contains(const OBJ* value)
00115 {
00116 if (m_base)
00117 return m_base->Contains(value);
00118 else
00119 return false;
00120 }
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 FDO_API virtual FdoInt32 IndexOf(const OBJ* value)
00132 {
00133 if (m_base)
00134 return m_base->IndexOf(value);
00135 else
00136 return -1;
00137 }
00138
00139 private:
00140 BASE* m_base;
00141 };
00142 #endif
00143
00144