1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #ifndef MED_SliceArray_HeaderFile
23 #define MED_SliceArray_HeaderFile
25 #ifdef WIN32 // for correctly compiling "valarray" in modules, which are includes this file
33 //#if defined(_DEBUG_)
34 # define MED_TCSLICE_CHECK_RANGE
39 //---------------------------------------------------------------
40 //! This class intends to provide an uniform way to handle multy-dimention data (const version)
42 It just contains pointer to real sequence and implement proper calcultion of its indexes.
43 This class deal with constant pointer to the sources data and provide const method to
46 template<class TValueType>
49 const TValueType* myCValuePtr; //!< Reference to source multy-dimension data
50 size_t mySourceSize; //!< Size of the source multy-dimension data
51 std::slice mySlice; //!< Defines algorithm of index calculation
55 check_id(size_t theId) const
58 if(theId < mySlice.size()){
59 anId = mySlice.start() + theId*mySlice.stride();
60 if(anId < (long int)mySourceSize)
63 throw std::out_of_range("TCSlice::check_id");
66 //! Calculate internal index to get proper element from the source multy-dimension data
68 calculate_id(size_t theId) const
70 return mySlice.start() + theId*mySlice.stride();
74 get_id(size_t theId) const
76 #ifdef MED_TCSLICE_CHECK_RANGE
79 return calculate_id(theId);
83 get_id_at(size_t theId) const
86 return calculate_id(theId);
90 typedef TValueType value_type;
92 //! Construct the class from bare pointer
93 TCSlice(const value_type* theValuePtr,
95 const std::slice& theSlice):
96 myCValuePtr(theValuePtr),
97 mySourceSize(theSourceSize),
101 //! Construct the class from corresponding container
102 TCSlice(const TVector<value_type>& theContainer,
103 const std::slice& theSlice):
104 myCValuePtr(&theContainer[0]),
105 mySourceSize(theContainer.size()),
109 //! Default constructor (dangerous)
114 //! Get element by its number (const version)
116 operator[](size_t theId) const
118 return *(myCValuePtr + get_id(theId));
122 at(size_t theId) const
124 return *(myCValuePtr + get_id_at(theId));
127 //! Get range of the order numbers
131 return mySlice.size();
136 //---------------------------------------------------------------
137 //! This class extend TCSlice functionality for non-constant case
138 template<class TValueType>
139 class TSlice: public TCSlice<TValueType>
141 TValueType* myValuePtr;
144 typedef TValueType value_type;
145 typedef TCSlice<TValueType> TSupperClass;
147 //! Construct the class from bare pointer
148 TSlice(value_type* theValuePtr,
149 size_t theSourceSize,
150 const std::slice& theSlice):
151 TSupperClass(theValuePtr, theSourceSize, theSlice),
152 myValuePtr(theValuePtr)
155 //! Construct the class from corresponding container
156 TSlice(TVector<value_type>& theContainer,
157 const std::slice& theSlice):
158 TSupperClass(theContainer, theSlice),
159 myValuePtr(&theContainer[0])
162 //! Default constructor (dangerous)
167 //! Get element by its number
169 operator[](size_t theId)
171 return *(myValuePtr + this->get_id(theId));
177 return *(myValuePtr + this->get_id_at(theId));
183 #undef MED_TCSLICE_CHECK_RANGE