#ifndef GUARD_RTGLIB_SHAPE_HPP #define GUARD_RTGLIB_SHAPE_HPP #include #include namespace rtg { struct shape { enum type_t { float_type, int_type }; shape(); shape(type_t t); shape(type_t t, std::vector l); shape(type_t t, std::vector l, std::vector s); type_t type() const; const std::vector lens() const; const std::vector strides() const; std::size_t elements() const; std::size_t bytes() const; friend bool operator==(const shape& x, const shape& y); friend bool operator!=(const shape& x, const shape& y); template struct as { using type = T; template T operator()(U u) const { return T(u); } T operator()() const { return {}; } std::size_t size(std::size_t n=0) const { return sizeof(T)*n; } template T& from(U* buffer, std::size_t n=0) const { return *(reinterpret_cast(buffer)+n); } }; template void visit_type(Visitor v) const { switch(this->type_) { case float_type: v(as()); return; case int_type: v(as()); return; } assert(true); } private: type_t type_; std::vector lens_; std::vector strides_; void calculate_strides(); std::size_t element_space() const; }; } #endif