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_