Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. namespace boost::numeric::ublas {
  2.  
  3. enum class storage_traits {
  4. READ_ONLY,
  5. READ_WRITE,
  6. };
  7.  
  8. struct storage_tag{};
  9.  
  10. namespace sparse {
  11.  
  12. template <class T, storage_traits S> struct sparse_policy;
  13.  
  14. template <class T> struct sparse_policy<T, storage_traits::READ_ONLY> : storage_tag {
  15. static constexpr storage_traits access = storage_traits::READ_ONLY;
  16. virtual T at(int) = 0;
  17. virtual T at(int) const = 0;
  18. };
  19.  
  20. template <class T> struct sparse_policy<T, storage_traits::READ_WRITE> : storage_tag{
  21. static constexpr storage_traits access = storage_traits::READ_WRITE;
  22. virtual T &at(int) = 0;
  23. virtual T at(int) const = 0;
  24. };
  25.  
  26. template<typename T>
  27. struct map_storage : sparse_policy<T, storage_traits::READ_ONLY>{
  28.  
  29. virtual T at(int k) override final {
  30. return 1;
  31. };
  32. virtual T at(int k) const override final {
  33. return b;
  34. };
  35.  
  36. // int a = 10;
  37. int b = 11;
  38. };
  39.  
  40. } // namespace sparse
  41. template<typename T>
  42. struct access_data {
  43. private:
  44. static constexpr auto lm = [](){
  45. if constexpr(std::is_base_of<storage_tag,T>::value){
  46. return T::access;
  47. }else{
  48. return storage_traits::READ_WRITE;
  49. }
  50. };
  51. public:
  52. static constexpr storage_traits value = lm();
  53. };
  54. } // namespace boost::numeric::ublas
  55.  
  56. namespace boost::numeric::ublas {
  57.  
  58. template <typename T, typename E = shape<dynamic_rank>,
  59. typename F = first_order, typename A = std::vector<T>>
  60. struct tensor {
  61. using base_type = A;
  62. using extent_type = E;
  63. using stride_type = stride_t<E, F>;
  64. tensor() {
  65. // data_ = base_type(extents_.size());
  66. }
  67.  
  68. tensor(size_t size, T val):data_(size,val){}
  69.  
  70. auto at(int k) -> std::conditional_t<access_data<A>::value == storage_traits::READ_ONLY, T, T& >{
  71. return data_.at(0);
  72. }
  73.  
  74. auto at(int k) const{
  75. data_.at(0);
  76. }
  77. /* .... */
  78. // private:
  79. base_type data_;
  80. extent_type extents_;
  81. stride_type strides_;
  82. };
  83. } // namespace boost::numeric::ublas
  84.  
  85.  
  86. int main(int argc, char const *argv[]) {
  87. tensor<int,shape<-1>,first_order,sparse::map_storage<int>> t1;
  88. cout<<t1.at(0)<<'\n'; // 1 type int
  89.  
  90. tensor<int> t2(2,10);
  91. t2.at(0) = 11;
  92. cout<<t2.at(0)<<'\n';// 11 type int&
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement