sustaining_gazes/lib/3rdParty/dlib/include/dlib/matrix/matrix_expressions.h

281 lines
8.1 KiB
C++

// Copyright (C) 2006 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_MATRIx_EXPRESSIONS_H_
#define DLIB_MATRIx_EXPRESSIONS_H_
#include "matrix_fwd.h"
#ifdef _MSC_VER
// This #pragma directive is also located in the algs.h file but for whatever
// reason visual studio 9 just ignores it when it is only there.
// this is to disable the "'this' : used in base member initializer list"
// warning you get from some of the GUI objects since all the objects
// require that their parent class be passed into their constructor.
// In this case though it is totally safe so it is ok to disable this warning.
#pragma warning(disable : 4355)
#endif
namespace dlib
{
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Helper templates for making operators used by expression objects
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
template <typename T>
class matrix_range_exp;
template <typename T>
struct matrix_traits<matrix_range_exp<T> >
{
typedef T type;
typedef const T const_ret_type;
typedef default_memory_manager mem_manager_type;
typedef row_major_layout layout_type;
const static long NR = 1;
const static long NC = 0;
const static long cost = 1;
};
template <typename T>
class matrix_range_exp : public matrix_exp<matrix_range_exp<T> >
{
public:
typedef typename matrix_traits<matrix_range_exp>::type type;
typedef typename matrix_traits<matrix_range_exp>::const_ret_type const_ret_type;
typedef typename matrix_traits<matrix_range_exp>::mem_manager_type mem_manager_type;
const static long NR = matrix_traits<matrix_range_exp>::NR;
const static long NC = matrix_traits<matrix_range_exp>::NC;
const static long cost = matrix_traits<matrix_range_exp>::cost;
typedef typename matrix_traits<matrix_range_exp>::layout_type layout_type;
matrix_range_exp (
T start_,
T end_
)
{
start = start_;
if (start_ <= end_)
inc = 1;
else
inc = -1;
nc_ = std::abs(end_ - start_) + 1;
}
matrix_range_exp (
T start_,
T inc_,
T end_
)
{
start = start_;
nc_ = std::abs(end_ - start_)/inc_ + 1;
if (start_ <= end_)
inc = inc_;
else
inc = -inc_;
}
matrix_range_exp (
T start_,
T end_,
long num,
bool
)
{
start = start_;
nc_ = num;
if (num > 1)
{
inc = (end_-start_)/(num-1);
}
else
{
inc = 0;
start = end_;
}
}
const_ret_type operator() (
long,
long c
) const { return start + c*inc; }
const_ret_type operator() (
long c
) const { return start + c*inc; }
template <typename U>
bool aliases (
const matrix_exp<U>&
) const { return false; }
template <typename U>
bool destructively_aliases (
const matrix_exp<U>&
) const { return false; }
long nr (
) const { return NR; }
long nc (
) const { return nc_; }
long nc_;
T start;
T inc;
};
// ----------------------------------------------------------------------------------------
template <typename T>
class matrix_log_range_exp;
template <typename T>
struct matrix_traits<matrix_log_range_exp<T> >
{
typedef T type;
typedef const T const_ret_type;
typedef default_memory_manager mem_manager_type;
typedef row_major_layout layout_type;
const static long NR = 1;
const static long NC = 0;
const static long cost = 1;
};
template <typename T>
class matrix_log_range_exp : public matrix_exp<matrix_log_range_exp<T> >
{
public:
typedef typename matrix_traits<matrix_log_range_exp>::type type;
typedef typename matrix_traits<matrix_log_range_exp>::const_ret_type const_ret_type;
typedef typename matrix_traits<matrix_log_range_exp>::mem_manager_type mem_manager_type;
const static long NR = matrix_traits<matrix_log_range_exp>::NR;
const static long NC = matrix_traits<matrix_log_range_exp>::NC;
const static long cost = matrix_traits<matrix_log_range_exp>::cost;
typedef typename matrix_traits<matrix_log_range_exp>::layout_type layout_type;
matrix_log_range_exp (
T start_,
T end_,
long num
)
{
start = start_;
nc_ = num;
if (num > 1)
{
inc = (end_-start_)/(num-1);
}
else
{
inc = 0;
start = end_;
}
}
const_ret_type operator() (
long,
long c
) const { return std::pow((T)10,start + c*inc); }
const_ret_type operator() (
long c
) const { return std::pow((T)10,start + c*inc); }
template <typename U>
bool aliases (
const matrix_exp<U>&
) const { return false; }
template <typename U>
bool destructively_aliases (
const matrix_exp<U>&
) const { return false; }
long nr (
) const { return NR; }
long nc (
) const { return nc_; }
long nc_;
T start;
T inc;
};
// ----------------------------------------------------------------------------------------
template <long start, long inc_, long end>
class matrix_range_static_exp;
template <long start, long inc_, long end>
struct matrix_traits<matrix_range_static_exp<start,inc_,end> >
{
typedef long type;
typedef const long const_ret_type;
typedef default_memory_manager mem_manager_type;
const static long NR = 1;
const static long NC = tabs<(end - start)>::value/inc_ + 1;
const static long cost = 1;
typedef row_major_layout layout_type;
};
template <long start, long inc_, long end_>
class matrix_range_static_exp : public matrix_exp<matrix_range_static_exp<start,inc_,end_> >
{
public:
typedef typename matrix_traits<matrix_range_static_exp>::type type;
typedef typename matrix_traits<matrix_range_static_exp>::const_ret_type const_ret_type;
typedef typename matrix_traits<matrix_range_static_exp>::mem_manager_type mem_manager_type;
const static long NR = matrix_traits<matrix_range_static_exp>::NR;
const static long NC = matrix_traits<matrix_range_static_exp>::NC;
const static long cost = matrix_traits<matrix_range_static_exp>::cost;
typedef typename matrix_traits<matrix_range_static_exp>::layout_type layout_type;
const static long inc = (start <= end_)?inc_:-inc_;
matrix_range_static_exp (
) {}
const_ret_type operator() (
long ,
long c
) const { return start + c*inc; }
const_ret_type operator() (
long c
) const { return start + c*inc; }
template <typename U>
bool aliases (
const matrix_exp<U>&
) const { return false; }
template <typename U>
bool destructively_aliases (
const matrix_exp<U>&
) const { return false; }
long nr (
) const { return NR; }
long nc (
) const { return NC; }
};
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_MATRIx_EXPRESSIONS_H_