00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VRS_CONTAINER_INDEXEDITERATOR_H
00021 #define VRS_CONTAINER_INDEXEDITERATOR_H
00022
00023 #include <vrs/container/iterator.h>
00024
00025 namespace VRS {
00026
00029 template<typename T, typename INDEX>
00030 class IndexedIterator :
00031 public Iterator<T>
00032 {
00033 public:
00034 VRS_TYPEINFO(IndexedIterator, Iterator<T>);
00035 VRS_SERIALIZABLE(IndexedIterator);
00036
00037 public:
00038 IndexedIterator(
00039 const SO<Iterator<T> >& sourceIter,
00040 const SO<Iterator<INDEX> >& indexIter
00041 ) :
00042 Iterator<T>(),
00043 m_sourceIter(sourceIter),
00044 m_indexIter(indexIter)
00045 {
00046 VRS_CheckArg(sourceIter, "no source iterator");
00047 VRS_CheckArg(indexIter, "no index iterator");
00048 }
00049
00050 virtual unsigned int size() const { return m_indexIter->size(); }
00051 virtual T get(unsigned int index) const { return m_sourceIter->get(m_indexIter->get(index)); }
00052
00053 virtual const TransactionNo& lastTransactionNo() const {
00054 return std::max(m_sourceIter->lastTransactionNo(), m_indexIter->lastTransactionNo());
00055 }
00056
00057 protected:
00058 IndexedIterator() { }
00059
00060 private:
00061 SO<Iterator<T> > m_sourceIter;
00062 SO<Iterator<INDEX> > m_indexIter;
00063 };
00064
00065 template<typename T, typename INDEX>
00066 void IndexedIterator<T, INDEX>::serialize(
00067 SerializationManager& doc
00068 ) {
00069 UINT8 version = 0;
00070 doc.classVersion(version);
00071
00072 VRS_SERIALIZATION_PARENT_CLASS(doc, Iterator<T>);
00073 serialization(doc, "sourceIterator", m_sourceIter);
00074 serialization(doc, "indexIterator", m_indexIter);
00075 }
00076
00077 VRS_SERIALIZATION_REGISTRATION_TEMPLATE_2(IndexedIterator);
00078
00079 }
00080
00081 #endif // VRS_CONTAINER_INDEXEDITERATOR_H