00001 00029 #ifndef GALOIS_LAZYARRAY_H 00030 #define GALOIS_LAZYARRAY_H 00031 00032 #include "Galois/config.h" 00033 #include "Galois/LazyObject.h" 00034 00035 #include <iterator> 00036 #include <stdexcept> 00037 #include <cstddef> 00038 #include GALOIS_CXX11_STD_HEADER(algorithm) 00039 #include GALOIS_CXX11_STD_HEADER(utility) 00040 #include GALOIS_CXX11_STD_HEADER(type_traits) 00041 00042 namespace Galois { 00043 00049 template<typename _Tp, unsigned _Size> 00050 class LazyArray { 00051 typedef typename std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>::type CharData; 00052 00053 LazyObject<_Tp> data_[(_Size > 0 ? _Size : 1)]; 00054 00055 _Tp* get(size_t __n) { return &data_[__n].get(); } 00056 const _Tp* get(size_t __n) const { return &data_[__n].get(); } 00057 00058 public: 00059 typedef _Tp value_type; 00060 typedef size_t size_type; 00061 typedef ptrdiff_t difference_type; 00062 typedef value_type& reference; 00063 typedef const value_type& const_reference; 00064 typedef value_type* pointer; 00065 typedef const value_type* const_pointer; 00066 typedef pointer iterator; 00067 typedef const_pointer const_iterator; 00068 typedef std::reverse_iterator<iterator> reverse_iterator; 00069 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 00070 00071 //iterators: 00072 iterator begin() { return iterator(get(0)); } 00073 const_iterator begin() const { return const_iterator(get(0)); } 00074 iterator end() { return iterator(get(_Size)); } 00075 const_iterator end() const { return const_iterator(get(_Size)); } 00076 00077 reverse_iterator rbegin() { return reverse_iterator(end()); } 00078 const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } 00079 reverse_iterator rend() { return reverse_iterator(begin()); } 00080 const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } 00081 00082 const_iterator cbegin() const { return begin(); } 00083 const_iterator cend() const { return end(); } 00084 const_reverse_iterator crbegin() const { return rbegin(); } 00085 const_reverse_iterator crend() const { return rend(); } 00086 00087 //capacity: 00088 size_type size() const { return _Size; } 00089 size_type max_size() const { return _Size; } 00090 bool empty() const { return _Size == 0; } 00091 00092 //element access: 00093 reference operator[](size_type __n) { return *get(__n); } 00094 const_reference operator[](size_type __n) const { return *get(__n); } 00095 reference at(size_type __n) { 00096 if (__n >= _Size) 00097 throw std::out_of_range("lazyArray::at"); 00098 return get(__n); 00099 } 00100 const_reference at(size_type __n) const { 00101 if (__n >= _Size) 00102 throw std::out_of_range("lazyArray::at"); 00103 return get(__n); 00104 } 00105 00106 reference front() { return *get(0); } 00107 const_reference front() const { return *get(0); } 00108 reference back() { return *get(_Size > 0 ? _Size - 1 : 0); } 00109 const_reference back() const { return *get(_Size > 0 ? _Size - 1 : 0); } 00110 00111 pointer data() { return get(0); } 00112 const_pointer data() const { return get(0); } 00113 00114 //missing: fill swap 00115 00116 template<typename... Args> 00117 pointer emplace(size_type __n, Args&&... args) { return new (get(__n)) _Tp(std::forward<Args>(args)...); } 00118 00119 pointer construct(size_type __n, const _Tp& val) { return emplace(__n, val); } 00120 pointer construct(size_type __n, _Tp&& val) { return emplace(__n, std::move(val)); } 00121 00122 void destroy(size_type __n) { (get(__n))->~_Tp(); } 00123 }; 00124 00125 } 00126 #endif // GALOIS_LAZYARRAY_H