static ptr_type offset(ptr_type ptr, index_type i) { switch (ptr.format()) { case array: return ptr_type(ptr.template as<array>() + i); case interleaved_complex: return ptr_type(ptr.template as<interleaved_complex>() + 2*i); case split_complex: { std::pair<T*,T*> p = ptr.template as<split_complex>(); return ptr_type(p.first + i, p.second + i); } default: assert(0); } }
static void put(ptr_type ptr, index_type i, value_type v) { switch (ptr.format()) { case array: *ptr.template as<array>() = v; break; case interleaved_complex: *reinterpret_cast<value_type*>(ptr.template as<interleaved_complex>()) = v; break; case split_complex: { std::pair<T const*,T const*> p = ptr.template as<split_complex>(); p.first = v.real(); p.second = v.imag(); break; } default: assert(0); } }