00001 #ifndef STRIDED_SEQUENCE_H_ 00002 #define STRIDED_SEQUENCE_H_ 00003 00004 #include "cksequence_internal.h" 00005 #include "pup.h" 00006 00007 #include <vector> 00008 #include <iostream> 00009 00010 template <typename T> 00011 class StridedIterator : public CkSequenceIteratorInternal<T> { 00012 public: 00013 T element_; 00014 T stride_; 00015 00016 StridedIterator() { 00017 } 00018 00019 StridedIterator(T element) : element_(element), stride_(0) { 00020 } 00021 00022 StridedIterator(T element, T stride) : element_(element), stride_(stride) { 00023 } 00024 00025 T operator*() { 00026 return element_; 00027 } 00028 00029 void operator++() { 00030 element_ += stride_; 00031 } 00032 00033 void operator++(int) { 00034 element_ += stride_; 00035 } 00036 00037 void operator--() { 00038 element_ -= stride_; 00039 } 00040 00041 void operator--(int) { 00042 element_ -= stride_; 00043 } 00044 00045 bool operator==(const CkSequenceIteratorInternal<T>& rhs) const { 00046 return (this->element_ == ((StridedIterator*)&rhs)->element_); 00047 } 00048 00049 bool operator!=(const CkSequenceIteratorInternal<T>& rhs) const { 00050 return (this->element_ != ((StridedIterator*)&rhs)->element_); 00051 } 00052 00053 00054 00055 }; 00056 00057 template <typename T> 00058 class StridedSequence : public CkSequenceInternal<T> { 00059 public: 00060 StridedSequence() : start_element_(1), stride_(1), last_element_(1) { 00061 } 00062 00063 StridedSequence(T start_element, T stride, int end_element) : 00064 start_element_(start_element), 00065 stride_(stride), 00066 last_element_(end_element) { 00067 } 00068 00069 void Insert(const T& element); 00070 00071 void Remove(const T& element); 00072 00073 int num_elements() const; 00074 00075 T min() const { 00076 return start_element_; 00077 } 00078 00079 T max() const { 00080 return last_element_; 00081 } 00082 00083 T stride() const { 00084 return stride_; 00085 } 00086 00087 Type type() const { 00088 return STRIDE; 00089 } 00090 00091 int mem_size() const; 00092 00093 CkSequenceIteratorInternal<T>* begin() { 00094 return new StridedIterator<T>(start_element_, stride_); 00095 } 00096 00097 CkSequenceIteratorInternal<T>* end() { 00098 return new StridedIterator<T>(last_element_ + stride_); 00099 } 00100 00101 void pup(PUP::er &p) { 00102 p|start_element_; 00103 p|stride_; 00104 p|last_element_; 00105 } 00106 00107 private: 00108 T start_element_; 00109 T stride_; 00110 T last_element_; 00111 }; 00112 00113 template <class T> 00114 inline void StridedSequence<T>::Insert(const T& element) { 00115 } 00116 00117 template <class T> 00118 inline void StridedSequence<T>::Remove(const T& element) { 00119 } 00120 00121 template <class T> 00122 inline int StridedSequence<T>::num_elements() const { 00123 return (((last_element_ - start_element_) / stride_) + 1); 00124 } 00125 00126 template <class T> 00127 inline int StridedSequence<T>::mem_size() const { 00128 return sizeof(T)*3; 00129 } 00130 00131 #endif // STRIDED_SEQUENCE_H_