base.hpp
来自「support vector clustering for vc++」· HPP 代码 · 共 480 行 · 第 1/2 页
HPP
480 行
// Copyright 2002 The Trustees of Indiana University.
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Boost.MultiArray Library
// Authors: Ronald Garcia
// Jeremy Siek
// Andrew Lumsdaine
// See http://www.boost.org/libs/multi_array for documentation.
#ifndef BASE_RG071801_HPP
#define BASE_RG071801_HPP
//
// base.hpp - some implementation base classes for from which
// functionality is acquired
//
#include "boost/multi_array/extent_range.hpp"
#include "boost/multi_array/extent_gen.hpp"
#include "boost/multi_array/index_range.hpp"
#include "boost/multi_array/index_gen.hpp"
#include "boost/multi_array/storage_order.hpp"
#include "boost/multi_array/types.hpp"
#include "boost/config.hpp"
#include "boost/multi_array/concept_checks.hpp" //for ignore_unused_...
#include "boost/mpl/eval_if.hpp"
#include "boost/mpl/if.hpp"
#include "boost/mpl/size_t.hpp"
#include "boost/mpl/aux_/msvc_eti_base.hpp"
#include "boost/iterator/reverse_iterator.hpp"
#include "boost/static_assert.hpp"
#include "boost/type.hpp"
#include "boost/assert.hpp"
#include <cstddef>
#include <memory>
namespace boost {
/////////////////////////////////////////////////////////////////////////
// class declarations
/////////////////////////////////////////////////////////////////////////
template<typename T, std::size_t NumDims,
typename Allocator = std::allocator<T> >
class multi_array;
// This is a public interface for use by end users!
namespace multi_array_types {
typedef boost::detail::multi_array::size_type size_type;
typedef std::ptrdiff_t difference_type;
typedef boost::detail::multi_array::index index;
typedef detail::multi_array::index_range<index,size_type> index_range;
typedef detail::multi_array::extent_range<index,size_type> extent_range;
typedef detail::multi_array::index_gen<0,0> index_gen;
typedef detail::multi_array::extent_gen<0> extent_gen;
}
// boost::extents and boost::indices are now a part of the public
// interface. That way users don't necessarily have to create their
// own objects. On the other hand, one may not want the overhead of
// object creation in small-memory environments. Thus, the objects
// can be left undefined by defining BOOST_MULTI_ARRAY_NO_GENERATORS
// before loading multi_array.hpp.
#if !BOOST_MULTI_ARRAY_NO_GENERATORS
namespace {
multi_array_types::extent_gen extents;
multi_array_types::index_gen indices;
}
#endif // BOOST_MULTI_ARRAY_NO_GENERATORS
namespace detail {
namespace multi_array {
template <typename T, std::size_t NumDims>
class sub_array;
template <typename T, std::size_t NumDims, typename TPtr = const T*>
class const_sub_array;
template <typename T, typename TPtr, typename NumDims, typename Reference>
class array_iterator;
template <typename T, std::size_t NumDims, typename TPtr = const T*>
class const_multi_array_view;
template <typename T, std::size_t NumDims>
class multi_array_view;
/////////////////////////////////////////////////////////////////////////
// class interfaces
/////////////////////////////////////////////////////////////////////////
class multi_array_base {
public:
typedef multi_array_types::size_type size_type;
typedef multi_array_types::difference_type difference_type;
typedef multi_array_types::index index;
typedef multi_array_types::index_range index_range;
typedef multi_array_types::extent_range extent_range;
typedef multi_array_types::index_gen index_gen;
typedef multi_array_types::extent_gen extent_gen;
};
//
// value_accessor_n
// contains the routines for accessing elements from
// N-dimensional views.
//
template<typename T, std::size_t NumDims>
class value_accessor_n : public multi_array_base {
typedef multi_array_base super_type;
public:
typedef typename super_type::index index;
//
// public typedefs used by classes that inherit from this base
//
typedef T element;
typedef boost::multi_array<T,NumDims-1> value_type;
typedef sub_array<T,NumDims-1> reference;
typedef const_sub_array<T,NumDims-1> const_reference;
protected:
// used by array operator[] and iterators to get reference types.
template <typename Reference, typename TPtr>
Reference access(boost::type<Reference>,index idx,TPtr base,
const size_type* extents,
const index* strides,
const index* index_bases) const {
BOOST_ASSERT(idx - index_bases[0] >= 0);
BOOST_ASSERT(size_type(idx - index_bases[0]) < extents[0]);
// return a sub_array<T,NDims-1> proxy object
TPtr newbase = base + idx * strides[0];
return Reference(newbase,extents+1,strides+1,index_bases+1);
}
value_accessor_n() { }
~value_accessor_n() { }
};
//
// value_accessor_one
// contains the routines for accessing reference elements from
// 1-dimensional views.
//
template<typename T>
class value_accessor_one : public multi_array_base {
typedef multi_array_base super_type;
public:
typedef typename super_type::index index;
//
// public typedefs for use by classes that inherit it.
//
typedef T element;
typedef T value_type;
typedef T& reference;
typedef T const& const_reference;
protected:
// used by array operator[] and iterators to get reference types.
template <typename Reference, typename TPtr>
Reference access(boost::type<Reference>,index idx,TPtr base,
const size_type* extents,
const index* strides,
const index* index_bases) const {
ignore_unused_variable_warning(index_bases);
ignore_unused_variable_warning(extents);
BOOST_ASSERT(idx - index_bases[0] >= 0);
BOOST_ASSERT(size_type(idx - index_bases[0]) < extents[0]);
return *(base + idx * strides[0]);
}
value_accessor_one() { }
~value_accessor_one() { }
};
/////////////////////////////////////////////////////////////////////////
// choose value accessor begins
//
template <typename T, std::size_t NumDims>
struct choose_value_accessor_n {
typedef value_accessor_n<T,NumDims> type;
};
template <typename T>
struct choose_value_accessor_one {
typedef value_accessor_one<T> type;
};
template <typename T, typename NumDims>
struct value_accessor_generator {
BOOST_STATIC_CONSTANT(std::size_t, dimensionality = NumDims::value);
typedef typename
mpl::eval_if_c<(dimensionality == 1),
choose_value_accessor_one<T>,
choose_value_accessor_n<T,dimensionality>
>::type type;
};
#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
struct eti_value_accessor
{
typedef int index;
typedef int size_type;
typedef int element;
typedef int index_range;
typedef int value_type;
typedef int reference;
typedef int const_reference;
};
template <>
struct value_accessor_generator<int,int>
{
typedef eti_value_accessor type;
};
template <class T, class NumDims>
struct associated_types
: mpl::aux::msvc_eti_base<
typename value_accessor_generator<T,NumDims>::type
>::type
{};
template <>
struct associated_types<int,int> : eti_value_accessor {};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?