Version: 9.16.0
SMESH_Indexer.hxx
Go to the documentation of this file.
1// Copyright (C) 2007-2026 CEA, EDF, OPEN CASCADE
2//
3// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5//
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.
10//
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.
15//
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
19//
20// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21//
22// File : SMESH_Indexer.hxx
23// Created : Tue May 21 18:24:01 2019
24// Author : Edward AGAPOV (eap)
25
26
27#ifndef __SMESH_Indexer_HXX__
28#define __SMESH_Indexer_HXX__
29
30//================================================================================
36{
37 size_t _xSize, _ySize;
38
40 SMESH_Indexer( size_t xSize=0, size_t ySize=0 ): _xSize(xSize), _ySize(ySize) {}
41
43 void set(size_t xSize, size_t ySize ) { _xSize = xSize, _ySize = ySize; }
44
46 size_t size() const { return _xSize * _ySize; }
47
48 // \return 1D index by two indices
49 size_t operator()(size_t x, size_t y) const { return y * _xSize + x; }
50};
51
52//================================================================================
58{
60
62 SMESH_Indexer3D( size_t xSize=0, size_t ySize=0, size_t zSize=0 ):
63 _xSize(xSize), _ySize(ySize), _zSize(zSize) {}
64
66 void set(size_t xSize, size_t ySize, size_t zSize )
67 { _xSize = xSize, _ySize = ySize, _zSize = zSize; }
68
70 size_t size() const { return _xSize * _ySize * _zSize; }
71
72 // \return 1D index by three indices
73 size_t operator()(size_t x, size_t y, size_t z) const { return z*_xSize*_ySize + y*_xSize + x; }
74};
75
76//================================================================================
99{
101public:
103 {
105 };
106
107 SMESH_OrientedIndexer( const SMESH_Indexer& indexer, const int oriFlags = NO_TRSF):
108 TFather( indexer._xSize, indexer._ySize ),
109 _xRevFun( (oriFlags & REV_X) ? & reverse : & lazy ),
110 _yRevFun( (oriFlags & REV_Y) ? & reverse : & lazy ),
111 _swapFun( (oriFlags & SWAP_XY ) ? & swap : & lazy ),
112 _xSizeOriented( indexer._xSize ),
113 _ySizeOriented( indexer._ySize )
114 {
115 (*_swapFun)( _xSizeOriented, _ySizeOriented );
116 }
117
119 size_t operator()(size_t x, size_t y) const
120 {
121 (*_swapFun)( x, y );
122 (*_xRevFun)( x, const_cast< size_t& >( _xSize ));
123 (*_yRevFun)( y, const_cast< size_t& >( _ySize ));
124 return TFather::operator()( x, y );
125 }
126
128 size_t corner(bool xMax, bool yMax) const
129 {
130 size_t x = xMax, y = yMax, size = 2;
131 (*_swapFun)( x, y );
132 (*_xRevFun)( x, size );
133 (*_yRevFun)( y, size );
134 return TFather::operator()( x ? _xSize-1 : 0,
135 y ? _ySize-1 : 0 );
136 }
137 size_t xSize() const { return _xSizeOriented; }
138 size_t ySize() const { return _ySizeOriented; }
139
140private:
141
142 typedef void (*TFun)(size_t& x, size_t& y);
144
146
147 static void lazy (size_t& , size_t& ) {}
148 static void reverse(size_t& x, size_t& size) { x = size - x - 1; }
149 static void swap (size_t& x, size_t& y) { std::swap( x, y ); }
150};
151
152
153#endif
Oriented converter of a pair of integers to a sole index.
Definition: SMESH_Indexer.hxx:99
static void reverse(size_t &x, size_t &size)
Definition: SMESH_Indexer.hxx:148
TFun _xRevFun
Definition: SMESH_Indexer.hxx:143
TFun _swapFun
Definition: SMESH_Indexer.hxx:143
static void swap(size_t &x, size_t &y)
Definition: SMESH_Indexer.hxx:149
size_t operator()(size_t x, size_t y) const
Return index for a corner.
Definition: SMESH_Indexer.hxx:119
TFun _yRevFun
Definition: SMESH_Indexer.hxx:143
static void lazy(size_t &, size_t &)
Definition: SMESH_Indexer.hxx:147
size_t _xSizeOriented
Definition: SMESH_Indexer.hxx:145
size_t corner(bool xMax, bool yMax) const
Definition: SMESH_Indexer.hxx:128
SMESH_Indexer TFather
Definition: SMESH_Indexer.hxx:100
OriFlags
< transformation types
Definition: SMESH_Indexer.hxx:103
@ MAX_ORI
Definition: SMESH_Indexer.hxx:104
@ REV_Y
Definition: SMESH_Indexer.hxx:104
@ SWAP_XY
Definition: SMESH_Indexer.hxx:104
@ REV_X
Definition: SMESH_Indexer.hxx:104
@ NO_TRSF
Definition: SMESH_Indexer.hxx:104
size_t xSize() const
Definition: SMESH_Indexer.hxx:137
void(* TFun)(size_t &x, size_t &y)
Definition: SMESH_Indexer.hxx:142
size_t _ySizeOriented
Definition: SMESH_Indexer.hxx:145
SMESH_OrientedIndexer(const SMESH_Indexer &indexer, const int oriFlags=NO_TRSF)
Return index by XY.
Definition: SMESH_Indexer.hxx:107
size_t ySize() const
Definition: SMESH_Indexer.hxx:138
Converter of a triple of indices to a sole index, useful to make 1D array behave as 3D one.
Definition: SMESH_Indexer.hxx:58
SMESH_Indexer3D(size_t xSize=0, size_t ySize=0, size_t zSize=0)
Initialize with size in two directions.
Definition: SMESH_Indexer.hxx:62
size_t size() const
Definition: SMESH_Indexer.hxx:70
size_t operator()(size_t x, size_t y, size_t z) const
Definition: SMESH_Indexer.hxx:73
size_t _xSize
Definition: SMESH_Indexer.hxx:59
void set(size_t xSize, size_t ySize, size_t zSize)
set size
Definition: SMESH_Indexer.hxx:66
size_t _zSize
Definition: SMESH_Indexer.hxx:59
size_t _ySize
Definition: SMESH_Indexer.hxx:59
Converter of a pair of indices to a sole index, useful to make 1D array behave as 2D one.
Definition: SMESH_Indexer.hxx:36
size_t operator()(size_t x, size_t y) const
Definition: SMESH_Indexer.hxx:49
void set(size_t xSize, size_t ySize)
set size
Definition: SMESH_Indexer.hxx:43
SMESH_Indexer(size_t xSize=0, size_t ySize=0)
Initialize with size in two directions.
Definition: SMESH_Indexer.hxx:40
size_t _xSize
Definition: SMESH_Indexer.hxx:37
size_t size() const
Definition: SMESH_Indexer.hxx:46
size_t _ySize
Definition: SMESH_Indexer.hxx:37