⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functors.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1997-2007  ETH Zurich (Switzerland).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/QP_solver/include/CGAL/QP_solver/functors.h $// $Id: functors.h 38453 2007-04-27 00:34:44Z gaertner $// //// Author(s)     : Sven Schoenherr //                 Bernd Gaertner <gaertner@inf.ethz.ch>//                 Franz Wessendorp //                 Kaspar Fischer#ifndef CGAL_QP_SOLVER_FUNCTORS_H#define CGAL_QP_SOLVER_FUNCTORS_H#include <CGAL/QP_solver/basic.h>#include <CGAL/function_objects.h>#include <functional>#include <iterator>CGAL_BEGIN_NAMESPACE// ==================// class declarations// ==================template < class VectorIt,           bool check_lower = false, bool check_upper = false >class QP_vector_accessor;template < class MatrixIt,           bool check_1st_lower = false, bool check_1st_upper = false,           bool check_2nd_lower = false, bool check_2nd_upper = false >class QP_matrix_accessor;template < class MatrixIt, typename ET >class QP_matrix_pairwise_accessor;template < class RndAccIt >class Value_by_basic_index;// =====================// class implementations// =====================// -------------------// QP_vector_accessor// -------------------template < class VectorIt, bool check_lower, bool check_upper >class QP_vector_accessor : public std::unary_function<    int, typename std::iterator_traits<VectorIt>::value_type > {  public:    typedef typename         std::unary_function<           int,            typename std::iterator_traits<VectorIt>::value_type >::result_type    result_type;    QP_vector_accessor( VectorIt it, int lower = 0, int upper = 0)        : z( 0), v( it), l(lower), u(upper)    {}    result_type  operator ( ) ( int i) const    {	if ( check_lower && i <  l) return z;	if ( check_upper && i >= u) return z;	return v[ i];    }  private:    const result_type  z;    VectorIt           v;    int                l;    int                u;};// ----------------------------------------------------------------------------// -------------------// QP_matrix_accessor// -------------------template < class MatrixIt, bool check_1st_lower, bool check_1st_upper,                           bool check_2nd_lower, bool check_2nd_upper >class QP_matrix_accessor {  public:        typedef CGAL::Arity_tag<2> Arity;    typedef int argument1_type;    typedef int argument2_type;    typedef typename std::iterator_traits<MatrixIt>::value_type VectorIt;    typedef typename std::iterator_traits<VectorIt>::value_type result_type;    QP_matrix_accessor( MatrixIt it, int lower_1 = 0, int upper_1 = 0,			              int lower_2 = 0, int upper_2 = 0)	: z( 0), m( it)    {	if ( check_1st_lower) l1 = lower_1;	if ( check_1st_upper) u1 = upper_1;	if ( check_2nd_lower) l2 = lower_2;	if ( check_2nd_upper) u2 = upper_2;    }    result_type  operator () ( int r, int c) const    {	if ( check_1st_lower && ( r <  l1)) return z;	if ( check_1st_upper && ( r >= u1)) return z;	if ( check_2nd_lower && ( c <  l2)) return z;	if ( check_2nd_upper && ( c >= u2)) return z;	return VectorIt(m[ r])[ c];    }  private:    const result_type  z;    MatrixIt           m;    int   l1, u1, l2, u2;};		 		 // ----------------------------------------------------------------------------// ----------------------------// QP_matrix_pairwise_accessor// ----------------------------template < class MatrixIt, typename ResultType >class QP_matrix_pairwise_accessor {  typedef  typename std::iterator_traits<MatrixIt>::value_type  VectorIt;  public:  typedef int        argument_type;  typedef ResultType result_type;    // The following default constructor is needed to make it possible  // to use QP_matrix_pairwise_accessor with CGAL's Join_input_iterator_1  // (more precisely: once Join_input_iterator_1 should not use an internal  // mutable variable 'val' anymore, you can remove the following default  // constructor).  QP_matrix_pairwise_accessor() {}    QP_matrix_pairwise_accessor( MatrixIt it, int row)    : m (it), v (*(it + row)), r (row)                                    {}    ResultType operator () ( int c) const  {    // make sure that only entries on or below the diagonal are    // accessed    if (c <= r)      return ResultType(v[ c]);     else      return ResultType((*(m + c))[ r]);  }  private:  MatrixIt           m;  VectorIt           v;  int                r;};// ----------------------------------------------------------------------------// --------------------// Value_by_basic_index// --------------------template < class RndAccIt >class Value_by_basic_index : public std::unary_function<    int, typename std::iterator_traits<RndAccIt>::value_type > {  public:    typedef typename    std::unary_function<      int, typename std::iterator_traits         <RndAccIt>::value_type >::result_type    result_type;    Value_by_basic_index( RndAccIt x_B_O_it, int n_original)	: o( x_B_O_it), s( x_B_O_it),	  l( n_original), u( n_original+0),	  z( 0)	{ }    Value_by_basic_index( RndAccIt x_B_O_it, int n_original,			  RndAccIt x_B_S_it, int n_slack = 0)	: o( x_B_O_it), s( x_B_S_it),	  l( n_original), u( n_original+n_slack),	  z( 0)	{ }    result_type  operator () ( int i) const        {	    if ( i < 0) return z;	    if ( i >= l && i < u) return s[ i];	    return o[ i];	}  private:    RndAccIt     o, s;    int          l, u;    result_type  z;};// ----------------------------------------------------------------------------// --------------------// Access_by_index// --------------------// A functor whose operator(int i) provides access to the i-th element// of a random access iterator.template < typename RndAccIt, typename ArgType >class QP_access_by_index {public:  typedef  typename std::iterator_traits<RndAccIt>::value_type result_type;  QP_access_by_index(RndAccIt it = RndAccIt()) : a(it) {}  result_type operator () (ArgType i) const { return a[i]; }private:  RndAccIt     a;};CGAL_END_NAMESPACE#endif // CGAL_QP_SOLVER_FUNCTORS_H// ===== EOF ==================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -