FDO API Reference Feature Data Objects

ReadOnlyCollection.h

Go to the documentation of this file.
00001 #ifndef _READONLYCOLLECTION_H_
00002 #define _READONLYCOLLECTION_H_
00003 // 
00004 
00005 //
00006 // Copyright (C) 2004-2006  Autodesk, Inc.
00007 // 
00008 // This library is free software; you can redistribute it and/or
00009 // modify it under the terms of version 2.1 of the GNU Lesser
00010 // General Public License as published by the Free Software Foundation.
00011 // 
00012 // This library is distributed in the hope that it will be useful,
00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015 // Lesser General Public License for more details.
00016 // 
00017 // You should have received a copy of the GNU Lesser General Public
00018 // License along with this library; if not, write to the Free Software
00019 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 //
00021 
00022 #ifdef _WIN32
00023 #pragma once
00024 #endif
00025 #include <FdoStd.h>
00026 
00027 /// \brief
00028 /// FdoReadOnlyCollection is an abstract template class used to define a collection
00029 /// that can not be modified after it is constructed, i.e. provides read-only access.
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     /// \brief
00050     /// Gets the number of items in the collection.
00051     /// 
00052     /// \return
00053     /// Returns number of items in the collection
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     /// \brief
00064     /// Gets the item in the collection at the specified index. Throws an invalid argument exception if the index is out of range.
00065     /// 
00066     /// \param index 
00067     /// Input index
00068     /// 
00069     /// \return
00070     /// Returns the item in the collection at the specified index
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     /// \brief
00081     /// Gets the item in the collection with the specified name. Throws an invalid argument exception if an item with the specified name does not exist in the collection.
00082     /// 
00083     /// \param name 
00084     /// Input name to find
00085     /// 
00086     /// \return
00087     /// Returns the item in the collection with the specified name
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     /// \brief
00106     /// Returns true if the collection contains the specified item, false otherwise.
00107     /// 
00108     /// \param value 
00109     /// Input value
00110     /// 
00111     /// \return
00112     /// Returns true if the collection contains the specified item, false otherwise
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     /// \brief
00123     /// Returns the index of the specified item in the collection or -1 if the item does not exist.
00124     /// 
00125     /// \param value 
00126     /// Input value
00127     /// 
00128     /// \return
00129     /// Returns the index of the specified item in the collection or -1 if the item does not exist
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 

Comments or suggestions? Send us feedback.