Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
OpenVolumeMesh
OpenVolumeMesh
Commits
5e58ac91
Commit
5e58ac91
authored
Jul 26, 2019
by
Martin Heistermann
Browse files
Remove legacy VectorT code.
parent
e911e7b1
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/OpenVolumeMesh/Geometry/VectorT.hh
View file @
5e58ac91
/* ========================================================================= *
* *
* OpenVolumeMesh *
* Copyright (c) 2001-2016, RWTH-Aachen University *
* Department of Computer Graphics and Multimedia *
* All rights reserved. *
* www.openvolumemesh.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenVolumeMesh. *
* This file was originally taken from OpenMesh *
*---------------------------------------------------------------------------*
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, *
* this list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
* ========================================================================= */
//=============================================================================
//
// CLASS VectorT
//
//=============================================================================
// Don't parse this header file with doxygen since
// for some reason (obviously due to a bug in doxygen,
// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182)
// macro expansion and preprocessor defines
// don't work properly.
#if ((defined _MSC_VER && _MSC_VER >= 1900) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENVOLUMEMESH_VECTOR_LEGACY)
#include
"Vector11T.hh"
#else
#ifndef DOXYGEN
#ifndef OPENVOLUMEMESH_VECTOR_HH
#define OPENVOLUMEMESH_VECTOR_HH
//== INCLUDES =================================================================
#include
<ostream>
#include
<cmath>
#include
<cassert>
#include
<cstring>
#if defined(__GNUC__) && defined(__SSE__)
#include
<xmmintrin.h>
#endif
//== NAMESPACES ===============================================================
namespace
OpenVolumeMesh
{
namespace
Geometry
{
//== CLASS DEFINITION =========================================================
/** The N values of the template Scalar type are the only data members
of the class VectorT<Scalar,N>. This guarantees 100% compatibility
with arrays of type Scalar and size N, allowing us to define the
cast operators to and from arrays and array pointers.
In addition, this class will be specialized for Vec4f to be 16 bit
aligned, so that aligned SSE instructions can be used on these
vectors.
*/
template
<
typename
Scalar
,
int
N
>
class
VectorDataT
{
public:
Scalar
values_
[
N
];
};
#if defined(__GNUC__) && defined(__SSE__)
/// This specialization enables us to use aligned SSE instructions.
template
<
>
class
VectorDataT
<
float
,
4
>
{
public:
union
{
__m128
m128
;
float
values_
[
4
];
};
};
#endif
//== CLASS DEFINITION =========================================================
#define DIM N
#define TEMPLATE_HEADER template <typename Scalar, int N>
#define CLASSNAME VectorT
#define DERIVED VectorDataT<Scalar,N>
#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
/** \class VectorT VectorT.hh <OpenVolumeMesh/Geometry/VectorT.hh>
A vector is an array of \<N\> values of type \<Scalar\>.
The actual data is stored in an VectorDataT, this class just adds
the necessary operators.
*/
#include
"VectorT_inc.hh"
#undef DIM
#undef TEMPLATE_HEADER
#undef CLASSNAME
#undef DERIVED
#undef unroll
//== PARTIAL TEMPLATE SPECIALIZATIONS =========================================
#define TEMPLATE_HEADER template <typename Scalar>
#define CLASSNAME VectorT<Scalar,DIM>
#define DERIVED VectorDataT<Scalar,DIM>
#define DIM 2
#define unroll(expr) expr(0) expr(1)
#define unroll_comb(expr, op) expr(0) op expr(1)
#define unroll_csv(expr) expr(0), expr(1)
#include
"VectorT_inc.hh"
#undef DIM
#undef unroll
#undef unroll_comb
#undef unroll_csv
#define DIM 3
#define unroll(expr) expr(0) expr(1) expr(2)
#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
#define unroll_csv(expr) expr(0), expr(1), expr(2)
#include
"VectorT_inc.hh"
#undef DIM
#undef unroll
#undef unroll_comb
#undef unroll_csv
#define DIM 4
#define unroll(expr) expr(0) expr(1) expr(2) expr(3)
#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
#include
"VectorT_inc.hh"
#undef DIM
#undef unroll
#undef unroll_comb
#undef unroll_csv
#define DIM 5
#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4)
#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4)
#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4)
#include
"VectorT_inc.hh"
#undef DIM
#undef unroll
#undef unroll_comb
#undef unroll_csv
#define DIM 6
#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5)
#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5)
#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5)
#include
"VectorT_inc.hh"
#undef DIM
#undef unroll
#undef unroll_comb
#undef unroll_csv
#undef TEMPLATE_HEADER
#undef CLASSNAME
#undef DERIVED
//== FULL TEMPLATE SPECIALIZATIONS ============================================
/// cross product for Vec3f
template
<
>
inline
VectorT
<
float
,
3
>
VectorT
<
float
,
3
>::
operator
%
(
const
VectorT
<
float
,
3
>&
_rhs
)
const
{
return
VectorT
<
float
,
3
>
(
values_
[
1
]
*
_rhs
.
values_
[
2
]
-
values_
[
2
]
*
_rhs
.
values_
[
1
],
values_
[
2
]
*
_rhs
.
values_
[
0
]
-
values_
[
0
]
*
_rhs
.
values_
[
2
],
values_
[
0
]
*
_rhs
.
values_
[
1
]
-
values_
[
1
]
*
_rhs
.
values_
[
0
]);
}
/// cross product for Vec3d
template
<
>
inline
VectorT
<
double
,
3
>
VectorT
<
double
,
3
>::
operator
%
(
const
VectorT
<
double
,
3
>&
_rhs
)
const
{
return
VectorT
<
double
,
3
>
(
values_
[
1
]
*
_rhs
.
values_
[
2
]
-
values_
[
2
]
*
_rhs
.
values_
[
1
],
values_
[
2
]
*
_rhs
.
values_
[
0
]
-
values_
[
0
]
*
_rhs
.
values_
[
2
],
values_
[
0
]
*
_rhs
.
values_
[
1
]
-
values_
[
1
]
*
_rhs
.
values_
[
0
]);
}
//== GLOBAL FUNCTIONS =========================================================
/// \relates OpenVolumeMesh::VectorT
/// scalar * vector
template
<
typename
Scalar1
,
typename
Scalar2
,
int
N
>
inline
VectorT
<
Scalar1
,
N
>
operator
*
(
Scalar2
_s
,
const
VectorT
<
Scalar1
,
N
>&
_v
)
{
return
_v
*
_s
;
}
/// \relates OpenVolumeMesh::VectorT
/// symmetric version of the dot product
template
<
typename
Scalar
,
int
N
>
inline
Scalar
dot
(
const
VectorT
<
Scalar
,
N
>&
_v1
,
const
VectorT
<
Scalar
,
N
>&
_v2
)
{
return
(
_v1
|
_v2
);
}
/// \relates OpenVolumeMesh::VectorT
/// symmetric version of the cross product
template
<
typename
Scalar
,
int
N
>
inline
VectorT
<
Scalar
,
N
>
cross
(
const
VectorT
<
Scalar
,
N
>&
_v1
,
const
VectorT
<
Scalar
,
N
>&
_v2
)
{
return
(
_v1
%
_v2
);
}
//== TYPEDEFS =================================================================
/** 1-byte signed vector */
typedef
VectorT
<
signed
char
,
1
>
Vec1c
;
/** 1-byte unsigned vector */
typedef
VectorT
<
unsigned
char
,
1
>
Vec1uc
;
/** 1-short signed vector */
typedef
VectorT
<
signed
short
int
,
1
>
Vec1s
;
/** 1-short unsigned vector */
typedef
VectorT
<
unsigned
short
int
,
1
>
Vec1us
;
/** 1-int signed vector */
typedef
VectorT
<
signed
int
,
1
>
Vec1i
;
/** 1-int unsigned vector */
typedef
VectorT
<
unsigned
int
,
1
>
Vec1ui
;
/** 1-float vector */
typedef
VectorT
<
float
,
1
>
Vec1f
;
/** 1-double vector */
typedef
VectorT
<
double
,
1
>
Vec1d
;
/** 2-byte signed vector */
typedef
VectorT
<
signed
char
,
2
>
Vec2c
;
/** 2-byte unsigned vector */
typedef
VectorT
<
unsigned
char
,
2
>
Vec2uc
;
/** 2-short signed vector */
typedef
VectorT
<
signed
short
int
,
2
>
Vec2s
;
/** 2-short unsigned vector */
typedef
VectorT
<
unsigned
short
int
,
2
>
Vec2us
;
/** 2-int signed vector */
typedef
VectorT
<
signed
int
,
2
>
Vec2i
;
/** 2-int unsigned vector */
typedef
VectorT
<
unsigned
int
,
2
>
Vec2ui
;
/** 2-float vector */
typedef
VectorT
<
float
,
2
>
Vec2f
;
/** 2-double vector */
typedef
VectorT
<
double
,
2
>
Vec2d
;
/** 3-byte signed vector */
typedef
VectorT
<
signed
char
,
3
>
Vec3c
;
/** 3-byte unsigned vector */
typedef
VectorT
<
unsigned
char
,
3
>
Vec3uc
;
/** 3-short signed vector */
typedef
VectorT
<
signed
short
int
,
3
>
Vec3s
;
/** 3-short unsigned vector */
typedef
VectorT
<
unsigned
short
int
,
3
>
Vec3us
;
/** 3-int signed vector */
typedef
VectorT
<
signed
int
,
3
>
Vec3i
;
/** 3-int unsigned vector */
typedef
VectorT
<
unsigned
int
,
3
>
Vec3ui
;
/** 3-float vector */
typedef
VectorT
<
float
,
3
>
Vec3f
;
/** 3-double vector */
typedef
VectorT
<
double
,
3
>
Vec3d
;
/** 3-bool vector */
typedef
VectorT
<
bool
,
3
>
Vec3b
;
/** 4-byte signed vector */
typedef
VectorT
<
signed
char
,
4
>
Vec4c
;
/** 4-byte unsigned vector */
typedef
VectorT
<
unsigned
char
,
4
>
Vec4uc
;
/** 4-short signed vector */
typedef
VectorT
<
signed
short
int
,
4
>
Vec4s
;
/** 4-short unsigned vector */
typedef
VectorT
<
unsigned
short
int
,
4
>
Vec4us
;
/** 4-int signed vector */
typedef
VectorT
<
signed
int
,
4
>
Vec4i
;
/** 4-int unsigned vector */
typedef
VectorT
<
unsigned
int
,
4
>
Vec4ui
;
/** 4-float vector */
typedef
VectorT
<
float
,
4
>
Vec4f
;
/** 4-double vector */
typedef
VectorT
<
double
,
4
>
Vec4d
;
/** 5-byte signed vector */
typedef
VectorT
<
signed
char
,
5
>
Vec5c
;
/** 5-byte unsigned vector */
typedef
VectorT
<
unsigned
char
,
5
>
Vec5uc
;
/** 5-short signed vector */
typedef
VectorT
<
signed
short
int
,
5
>
Vec5s
;
/** 5-short unsigned vector */
typedef
VectorT
<
unsigned
short
int
,
5
>
Vec5us
;
/** 5-int signed vector */
typedef
VectorT
<
signed
int
,
5
>
Vec5i
;
/** 5-int unsigned vector */
typedef
VectorT
<
unsigned
int
,
5
>
Vec5ui
;
/** 5-float vector */
typedef
VectorT
<
float
,
5
>
Vec5f
;
/** 5-double vector */
typedef
VectorT
<
double
,
5
>
Vec5d
;
/** 6-byte signed vector */
typedef
VectorT
<
signed
char
,
6
>
Vec6c
;
/** 6-byte unsigned vector */
typedef
VectorT
<
unsigned
char
,
6
>
Vec6uc
;
/** 6-short signed vector */
typedef
VectorT
<
signed
short
int
,
6
>
Vec6s
;
/** 6-short unsigned vector */
typedef
VectorT
<
unsigned
short
int
,
6
>
Vec6us
;
/** 6-int signed vector */
typedef
VectorT
<
signed
int
,
6
>
Vec6i
;
/** 6-int unsigned vector */
typedef
VectorT
<
unsigned
int
,
6
>
Vec6ui
;
/** 6-float vector */
typedef
VectorT
<
float
,
6
>
Vec6f
;
/** 6-double vector */
typedef
VectorT
<
double
,
6
>
Vec6d
;
//=============================================================================
}
// namespace Geometry
template
<
class
T
>
const
std
::
string
typeName
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec2f
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec2d
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec2i
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec2ui
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec3f
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec3d
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec3i
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec3ui
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec4f
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec4d
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec4i
>
();
template
<
>
const
std
::
string
typeName
<
Geometry
::
Vec4ui
>
();
}
// namespace OpenVolumeMesh
//=============================================================================
#endif // OPENVOLUMEMESH_VECTOR_HH defined
//=============================================================================
#endif // DOXYGEN
#endif // C++11
src/OpenVolumeMesh/Geometry/VectorT_inc.hh
deleted
100644 → 0
View file @
e911e7b1
/* ========================================================================= *
* *
* OpenVolumeMesh *
* Copyright (c) 2001-2016, RWTH-Aachen University *
* Department of Computer Graphics and Multimedia *
* All rights reserved. *
* www.openvolumemesh.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenVolumeMesh. *
* This file was originally taken from OpenMesh *
*---------------------------------------------------------------------------*
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice, *
* this list of conditions and the following disclaimer. *
* *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* *
* 3. Neither the name of the copyright holder nor the names of its *
* contributors may be used to endorse or promote products derived from *
* this software without specific prior written permission. *
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
* *
* ========================================================================= */
/*===========================================================================*\
* *
* $Revision$ *
* $Date$ *
* *
\*===========================================================================*/
// Set template keywords and class names properly when
// parsing with doxygen. This only seems to work this way since
// the scope of preprocessor defines is limited to one file in doxy.
#ifdef DOXYGEN
// Only used for correct doxygen parsing
#define OPENVOLUMEMESH_VECTOR_HH
#define DIM N
#define TEMPLATE_HEADER template <typename Scalar, int N>
#define CLASSNAME VectorT
#define DERIVED VectorDataT<Scalar,N>
#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
#endif
#if defined( OPENVOLUMEMESH_VECTOR_HH )
// ----------------------------------------------------------------------------
TEMPLATE_HEADER
class
CLASSNAME
:
public
DERIVED
{
private:
typedef
DERIVED
Base
;
public:
//---------------------------------------------------------------- class info
/// the type of the scalar used in this template
typedef
Scalar
value_type
;
/// type of this vector
typedef
VectorT
<
Scalar
,
DIM
>
vector_type
;
/// returns dimension of the vector (deprecated)
static
inline
int
dim
()
{
return
DIM
;
}
/// returns dimension of the vector
static
inline
size_t
size
()
{
return
DIM
;
}
static
const
size_t
size_
=
DIM
;
//-------------------------------------------------------------- constructors
/// default constructor creates uninitialized values.
inline
VectorT
()
{}
/// special constructor for 1D vectors
explicit
inline
VectorT
(
const
Scalar
&
v
)
{
// assert(DIM==1);
// values_[0] = v0;
vectorize
(
v
);
}
#if DIM == 2
/// special constructor for 2D vectors
inline
VectorT
(
const
Scalar
v0
,
const
Scalar
v1
)
{
Base
::
values_
[
0
]
=
v0
;
Base
::
values_
[
1
]
=
v1
;
}
#endif
#if DIM == 3
/// special constructor for 3D vectors
inline
VectorT
(
const
Scalar
v0
,
const
Scalar
v1
,
const
Scalar
v2
)
{
Base
::
values_
[
0
]
=
v0
;
Base
::
values_
[
1
]
=
v1
;
Base
::
values_
[
2
]
=
v2
;
}
#endif
#if DIM == 4
/// special constructor for 4D vectors
inline
VectorT
(
const
Scalar
v0
,
const
Scalar
v1
,
const
Scalar
v2
,
const
Scalar
v3
)
{
Base
::
values_
[
0
]
=
v0
;
Base
::
values_
[
1
]
=
v1
;
Base
::
values_
[
2
]
=
v2
;
Base
::
values_
[
3
]
=
v3
;
}
VectorT
homogenized
()
const
{
return
VectorT
(
Base
::
values_
[
0
]
/
Base
::
values_
[
3
],
Base
::
values_
[
1
]
/
Base
::
values_
[
3
],
Base
::
values_
[
2
]
/
Base
::
values_
[
3
],
1
);
}
#endif
#if DIM == 5
/// special constructor for 5D vectors
inline
VectorT
(
const
Scalar
v0
,
const
Scalar
v1
,
const
Scalar
v2
,
const
Scalar
v3
,
const
Scalar
v4
)
{
Base
::
values_
[
0
]
=
v0
;
Base
::
values_
[
1
]
=
v1
;
Base
::
values_
[
2
]
=
v2
;
Base
::
values_
[
3
]
=
v3
;
Base
::
values_
[
4
]
=
v4
;
}
#endif
#if DIM == 6
/// special constructor for 6D vectors
inline
VectorT
(
const
Scalar
v0
,
const
Scalar
v1
,
const
Scalar
v2
,
const
Scalar
v3
,
const
Scalar
v4
,
const
Scalar
v5
)
{
Base
::
values_
[
0
]
=
v0
;
Base
::
values_
[
1
]
=
v1
;
Base
::
values_
[
2
]
=
v2
;
Base
::
values_
[
3
]
=
v3
;
Base
::
values_
[
4
]
=
v4
;
Base
::
values_
[
5
]
=
v5
;
}
#endif
/// construct from a value array (explicit)
explicit
inline
VectorT
(
const
Scalar
_values
[
DIM
])
{
memcpy
(
data
(),
_values
,
DIM
*
sizeof
(
Scalar
));
}
#ifdef OM_CC_MIPS
/// assignment from a vector of the same kind
// mipspro need this method
inline
vector_type
&
operator
=
(
const
vector_type
&
_rhs
)
{
memcpy
(
Base
::
values_
,
_rhs
.
Base
::
values_
,
DIM
*
sizeof
(
Scalar
));
return
*
this
;
}
#endif
/// copy & cast constructor (explicit)
template
<
typename
otherScalarType
>
explicit
inline
VectorT
(
const
VectorT
<
otherScalarType
,
DIM
>&
_rhs
)
{
operator
=
(
_rhs
);
}
//--------------------------------------------------------------------- casts
/// cast from vector with a different scalar type
template
<
typename
otherScalarType
>
inline
vector_type
&
operator
=
(
const
VectorT
<
otherScalarType
,
DIM
>&
_rhs
)
{
#define expr(i) Base::values_[i] = (Scalar)_rhs[i];
unroll
(
expr
);
#undef expr
return
*
this
;
}
// /// cast to Scalar array
// inline operator Scalar*() { return Base::values_; }
// /// cast to const Scalar array
// inline operator const Scalar*() const { return Base::values_; }
/// access to Scalar array
inline
Scalar
*
data
()
{
return
Base
::
values_
;
}
/// access to const Scalar array
inline
const
Scalar
*
data
()
const
{
return
Base
::
values_
;
}
//----------------------------------------------------------- element access
// /// get i'th element read-write
// inline Scalar& operator[](int _i) {
// assert(_i>=0 && _i<DIM); return Base::values_[_i];
// }
// /// get i'th element read-only
// inline const Scalar& operator[](int _i) const {
// assert(_i>=0 && _i<DIM); return Base::values_[_i];
// }
/// get i'th element read-write
inline
Scalar
&
operator
[](
size_t
_i
)
{
assert
(
_i
<
DIM
);
return
Base
::
values_
[
_i
];
}
/// get i'th element read-only