Line data Source code
1 : #ifndef AMREX_LayoutData_H_ 2 : #define AMREX_LayoutData_H_ 3 : #include <AMReX_Config.H> 4 : 5 : #include <AMReX_FabArrayBase.H> 6 : #include <AMReX_MFIter.H> 7 : 8 : namespace amrex 9 : { 10 : //! a one-thingy-per-box distributed object 11 : template <class T> 12 : class LayoutData: public FabArrayBase 13 : { 14 : public: 15 : 16 : //! 17 0 : LayoutData() = default; 18 : 19 0 : LayoutData(const BoxArray & a_grids, 20 : const DistributionMapping & a_dm) 21 0 : { 22 0 : define(a_grids, a_dm); 23 0 : } 24 : 25 0 : void define(const BoxArray & a_grids, 26 : const DistributionMapping & a_dm) 27 : { 28 0 : FabArrayBase::define(a_grids, a_dm, 1, 0); 29 0 : m_need_to_clear_bd = true; 30 0 : addThisBD(); 31 0 : m_data.resize(local_size()); 32 0 : } 33 : 34 300 : ~LayoutData () { if (m_need_to_clear_bd) { clearThisBD(); } } 35 : 36 : LayoutData (const LayoutData& rhs) noexcept 37 : : FabArrayBase(rhs), 38 : m_data(rhs.m_data), 39 : m_need_to_clear_bd(rhs.m_need_to_clear_bd) 40 : { 41 : if (m_need_to_clear_bd) { addThisBD(); } 42 : } 43 : 44 : LayoutData (LayoutData&& rhs) noexcept 45 : : FabArrayBase(static_cast<FabArrayBase&&>(rhs)), 46 : m_data(std::move(rhs.m_data)), 47 : m_need_to_clear_bd(rhs.m_need_to_clear_bd) 48 : { 49 : rhs.m_need_to_clear_bd = false; 50 : } 51 : 52 : LayoutData& operator= (const LayoutData& rhs) noexcept 53 : { 54 : if (&rhs != this) 55 : { 56 : m_data.clear(); 57 : if (m_need_to_clear_bd) { clearThisBD(); } 58 : 59 : FabArrayBase::operator=(rhs); 60 : m_data = rhs.m_data; 61 : m_need_to_clear_bd = rhs.m_need_to_clear_bd; 62 : 63 : if (m_need_to_clear_bd) { addThisBD(); } 64 : } 65 : return *this; 66 : } 67 : 68 : LayoutData& operator= (LayoutData&& rhs) noexcept 69 : { 70 : if (&rhs != this) 71 : { 72 : m_data.clear(); 73 : if (m_need_to_clear_bd) { clearThisBD(); } 74 : 75 : FabArrayBase::operator=(static_cast<FabArrayBase&&>(rhs)); 76 : m_data = std::move(rhs.m_data); 77 : m_need_to_clear_bd = rhs.m_need_to_clear_bd; 78 : 79 : rhs.m_need_to_clear_bd = false; 80 : } 81 : return *this; 82 : } 83 : 84 0 : T& operator[](const MFIter& a_mfi) noexcept 85 : { 86 0 : int local_index = a_mfi.LocalIndex(); 87 : BL_ASSERT(local_index >= 0 && local_index < m_data.size() && 88 : DistributionMap() == a_mfi.DistributionMap()); 89 0 : return m_data[local_index]; 90 : } 91 : 92 : 93 : const T& operator[](const MFIter& a_mfi) const noexcept 94 : { 95 : int local_index = a_mfi.LocalIndex(); 96 : BL_ASSERT(local_index >= 0 && local_index < m_data.size() && 97 : DistributionMap() == a_mfi.DistributionMap()); 98 : return m_data[local_index]; 99 : } 100 : 101 0 : T& operator[](int a_box_index) noexcept 102 : { 103 0 : int local_index = this->localindex(a_box_index); 104 : BL_ASSERT(local_index >= 0 && local_index < m_data.size()); 105 0 : return m_data[local_index]; 106 : } 107 : 108 : 109 : const T& operator[](int a_box_index) const noexcept 110 : { 111 : int local_index = this->localindex(a_box_index); 112 : BL_ASSERT(local_index >= 0 && local_index < m_data.size()); 113 : return m_data[local_index]; 114 : } 115 : 116 : const T* data () const noexcept { return m_data.data(); } 117 : T* data () noexcept { return m_data.data(); } 118 : 119 : private: 120 : Vector<T> m_data; 121 : bool m_need_to_clear_bd = false; 122 : }; 123 : } 124 : #endif