00001
00002
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
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 #ifndef VRS_CONTAINER_SUBITERATOR_H
00059 #define VRS_CONTAINER_SUBITERATOR_H
00060
00061 #include <vrs/container/iterator.h>
00062
00063 namespace VRS {
00064
00066 template<typename T>
00067 class SubIterator : public Iterator<T> {
00068 public:
00069 SubIterator(const Iterator<T>* sourceItr, unsigned int offset = 0)
00070 : itr_(sourceItr), offset_(offset) {
00071 VRS_CheckArg(sourceItr, "no iterator");
00072 VRS_CheckArg(offset <= sourceItr->size(), "offset out of range");
00073 length_ = sourceItr->size() - offset;
00074 }
00075
00076 SubIterator(Iterator<T>* sourceItr, unsigned int offset, unsigned int length)
00077 : itr_(sourceItr), offset_(offset), length_(length) {
00078 VRS_CheckArg(sourceItr, "no iterator");
00079 VRS_CheckArg(offset <= sourceItr->size(), "offset out of range");
00080 VRS_CheckArg(offset + length <= sourceItr->size(), "length out of range");
00081 }
00082
00083 virtual unsigned int size() const { return length_; }
00084 virtual T get(unsigned int index) const { return itr_->get(offset_ + index); }
00085
00086 virtual const T* pointer() const { const T* const ptr = itr_->pointer(); return (ptr ? (ptr + offset_) : NULL); }
00087
00088 virtual const TransactionNo& lastTransactionNo() const { return itr_->lastTransactionNo(); }
00089
00090 VRS_TYPEINFO(SubIterator, Iterator<T>);
00091 VRS_SERIALIZABLE(SubIterator);
00092
00093 protected:
00094 SubIterator() { }
00095
00096 private:
00097 SO<const Iterator<T> > itr_;
00098 unsigned int offset_;
00099 unsigned int length_;
00100 };
00101
00102 template<typename T>
00103 void SubIterator<T>::serialize(SerializationManager& doc) {
00104 UINT8 version = 0;
00105 doc.classVersion(version);
00106
00107 VRS_SERIALIZATION_PARENT_CLASS(doc, Iterator<T>);
00108 serialization(doc, "Length", length_);
00109 serialization(doc, "Offset", offset_);
00110 serialization(doc, "Iterator", itr_);
00111 }
00112
00113 VRS_SERIALIZATION_REGISTRATION_TEMPLATE(SubIterator);
00114
00115 }
00116
00117 #endif // VRS_CONTAINER_SUBITERATOR_H
00118