From eb796c15585caaa383dcd031bbc7351f8a11bcd5 Mon Sep 17 00:00:00 2001 From: Cris Cecka Date: Fri, 15 May 2015 14:47:13 -0700 Subject: [PATCH] Solid iterators, range type maps, examples. --- makefile | 3 ++ soa-range.cc | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100755 soa-range.cc diff --git a/makefile b/makefile index 9429a61..74b8a73 100644 --- a/makefile +++ b/makefile @@ -4,6 +4,9 @@ CXXFLAGS := -std=c++11 -Wall soa-iterator: soa-iterator.cc $(CXX) $(CXXFLAGS) $< -o $@ +soa-range: soa-range.cc + $(CXX) $(CXXFLAGS) $< -o $@ + .PHONY: run run: soa-iterator ./$< diff --git a/soa-range.cc b/soa-range.cc new file mode 100755 index 0000000..045b14d --- /dev/null +++ b/soa-range.cc @@ -0,0 +1,97 @@ +#include +#include +#include + +#include + +// Printer helpers for library types + +std::ostream& operator<<(std::ostream& s, const thrust::tuple& p) { + std::cout << "(" << thrust::get<0>(p) << ", " << thrust::get<1>(p) << ")"; +} + +// define the container +class PointBuffer { + + public: + + typedef thrust::tuple value_type; + typedef std::vector::size_type size_type; + + typedef typename std::vector::iterator c_iterator; + typedef thrust::tuple iter_pair; + typedef thrust::zip_iterator iterator; + + size_type size() const { return x.size(); } + + void resize(size_type count) { + x.resize(count); + y.resize(count); + } + + iterator begin() { return iterator(iter_pair(x.begin(), y.begin())); } + iterator end() { return iterator(iter_pair(x.end(), y.end() )); } + + c_iterator x_begin() { return x.begin(); } + c_iterator x_end() { return x.end(); } + + c_iterator y_begin() { return y.begin(); } + c_iterator y_end() { return y.end(); } + + private: + std::vector x; + std::vector y; +}; + +// Range access + +struct xrange { + xrange(PointBuffer& _pb) : pb(_pb) {} + typename PointBuffer::c_iterator begin() { return pb.x_begin(); } + typename PointBuffer::c_iterator end() { return pb.x_end(); } + PointBuffer& pb; +}; + +struct yrange { + yrange(PointBuffer& _pb) : pb(_pb) {} + typename PointBuffer::c_iterator begin() { return pb.y_begin(); } + typename PointBuffer::c_iterator end() { return pb.y_end(); } + PointBuffer& pb; +}; + +// Printers + +struct Printor { + template + void operator()(const T& p) { + std::cout << p << std::endl; + } +}; + +template +void print(Range&& r) { + for (const auto& i : r) + std::cout << i << std::endl; +} + +int main() { + PointBuffer p; + p.resize(3); + double c = 0.0; + + for (auto& x : xrange(p)) + x = c++; + for (auto& y : yrange(p)) + y = c++; + + print(xrange(p)); + print(yrange(p)); + print(p); + std::cout << std::endl; + + std::for_each(p.begin(), p.end(), Printor()); + + std::cout << "--- end of soa-iterator ---" << std::endl; + + return 0; +}