Initial Commit
This commit is contained in:
@@ -0,0 +1,222 @@
|
||||
#include "displaytext.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QDateTime>
|
||||
#include <QTextCharFormat>
|
||||
#include <QFont>
|
||||
#include <QTextCursor>
|
||||
|
||||
#include "qt_helpers.hpp"
|
||||
|
||||
#include "moc_displaytext.cpp"
|
||||
|
||||
DisplayText::DisplayText(QWidget *parent) :
|
||||
QTextEdit(parent)
|
||||
{
|
||||
setReadOnly (true);
|
||||
viewport ()->setCursor (Qt::ArrowCursor);
|
||||
setWordWrapMode (QTextOption::NoWrap);
|
||||
setStyleSheet ("");
|
||||
}
|
||||
|
||||
void DisplayText::setContentFont(QFont const& font)
|
||||
{
|
||||
setFont (font);
|
||||
m_charFormat.setFont (font);
|
||||
selectAll ();
|
||||
auto cursor = textCursor ();
|
||||
cursor.mergeCharFormat (m_charFormat);
|
||||
cursor.clearSelection ();
|
||||
cursor.movePosition (QTextCursor::End);
|
||||
|
||||
// position so viewport scrolled to left
|
||||
cursor.movePosition (QTextCursor::Up);
|
||||
cursor.movePosition (QTextCursor::StartOfLine);
|
||||
|
||||
setTextCursor (cursor);
|
||||
ensureCursorVisible ();
|
||||
}
|
||||
|
||||
void DisplayText::mouseDoubleClickEvent(QMouseEvent *e)
|
||||
{
|
||||
bool ctrl = (e->modifiers() & Qt::ControlModifier);
|
||||
bool alt = (e->modifiers() & Qt::AltModifier);
|
||||
emit(selectCallsign(alt,ctrl));
|
||||
QTextEdit::mouseDoubleClickEvent(e);
|
||||
}
|
||||
|
||||
void DisplayText::insertLineSpacer(QString const& line)
|
||||
{
|
||||
appendText (line, "#d3d3d3");
|
||||
}
|
||||
|
||||
void DisplayText::appendText(QString const& text, QString const& bg)
|
||||
{
|
||||
QString escaped {text.trimmed().replace('<',"<").replace('>',">").replace(' ', " ")};
|
||||
QString s = "<table border=0 cellspacing=0 width=100%><tr><td bgcolor=\"" +
|
||||
bg + "\">" + escaped + "</td></tr></table>";
|
||||
auto cursor = textCursor ();
|
||||
cursor.movePosition (QTextCursor::End);
|
||||
auto pos = cursor.position ();
|
||||
cursor.insertHtml (s);
|
||||
cursor.setPosition (pos, QTextCursor::MoveAnchor);
|
||||
cursor.movePosition (QTextCursor::End, QTextCursor::KeepAnchor);
|
||||
cursor.mergeCharFormat (m_charFormat);
|
||||
cursor.clearSelection ();
|
||||
|
||||
// position so viewport scrolled to left
|
||||
cursor.movePosition (QTextCursor::Up);
|
||||
cursor.movePosition (QTextCursor::StartOfLine);
|
||||
setTextCursor (cursor);
|
||||
ensureCursorVisible ();
|
||||
}
|
||||
|
||||
|
||||
QString DisplayText::_appendDXCCWorkedB4(QString message, QString const& callsign, QString * bg,
|
||||
LogBook logBook, QColor color_CQ,
|
||||
QColor color_DXCC,
|
||||
QColor color_NewCall)
|
||||
{
|
||||
QString call = callsign;
|
||||
QString countryName;
|
||||
bool callWorkedBefore;
|
||||
bool countryWorkedBefore;
|
||||
|
||||
if(call.length()==2) {
|
||||
int i0=message.indexOf("CQ "+call);
|
||||
call=message.mid(i0+6,-1);
|
||||
i0=call.indexOf(" ");
|
||||
call=call.mid(0,i0);
|
||||
}
|
||||
if(call.length()<3) return message;
|
||||
if(!call.contains(QRegExp("[0-9]|[A-Z]"))) return message;
|
||||
|
||||
logBook.match(/*in*/call,/*out*/countryName,callWorkedBefore,countryWorkedBefore);
|
||||
int charsAvail = 48;
|
||||
|
||||
// the decoder (seems) to always generate 41 chars. For a normal CQ call, the last five are spaces
|
||||
// TODO this magic 37 characters is also referenced in MainWindow::doubleClickOnCall()
|
||||
int nmin=37;
|
||||
int i=message.indexOf(" CQ ");
|
||||
int k=message.mid(i+4,3).toInt();
|
||||
if(k>0 and k<999) nmin += 4;
|
||||
int s3 = message.indexOf(" ",nmin);
|
||||
if (s3 < nmin) s3 = nmin; // always want at least the characters to position 35
|
||||
s3 += 1; // convert the index into a character count
|
||||
message = message.left(s3); // reduce trailing white space
|
||||
charsAvail -= s3;
|
||||
if (charsAvail > 4)
|
||||
{
|
||||
if (!countryWorkedBefore) // therefore not worked call either
|
||||
{
|
||||
message += "!";
|
||||
*bg = color_DXCC.name();
|
||||
}
|
||||
else
|
||||
if (!callWorkedBefore) // but have worked the country
|
||||
{
|
||||
message += "~";
|
||||
*bg = color_NewCall.name();
|
||||
}
|
||||
else
|
||||
{
|
||||
message += " "; // have worked this call before
|
||||
*bg = color_CQ.name();
|
||||
}
|
||||
charsAvail -= 1;
|
||||
|
||||
// do some obvious abbreviations
|
||||
countryName.replace ("Islands", "Is.");
|
||||
countryName.replace ("Island", "Is.");
|
||||
countryName.replace ("North ", "N. ");
|
||||
countryName.replace ("Northern ", "N. ");
|
||||
countryName.replace ("South ", "S. ");
|
||||
countryName.replace ("East ", "E. ");
|
||||
countryName.replace ("Eastern ", "E. ");
|
||||
countryName.replace ("West ", "W. ");
|
||||
countryName.replace ("Western ", "W. ");
|
||||
countryName.replace ("Central ", "C. ");
|
||||
countryName.replace (" and ", " & ");
|
||||
countryName.replace ("Republic", "Rep.");
|
||||
countryName.replace ("United States", "U.S.A.");
|
||||
countryName.replace ("Fed. Rep. of ", "");
|
||||
countryName.replace ("French ", "Fr.");
|
||||
countryName.replace ("Asiatic", "AS");
|
||||
countryName.replace ("European", "EU");
|
||||
countryName.replace ("African", "AF");
|
||||
|
||||
//
|
||||
// deal with special rules that cty.dat does not cope with
|
||||
//
|
||||
|
||||
// KG4 2x1 and 2x3 calls that map to Gitmo are mainland US not Gitmo
|
||||
if (call.startsWith ("KG4") && call.size () != 5)
|
||||
{
|
||||
countryName.replace ("Guantanamo Bay", "U.S.A.");
|
||||
}
|
||||
|
||||
message += countryName;
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
void DisplayText::displayDecodedText(DecodedText decodedText, QString myCall,
|
||||
bool displayDXCCEntity, LogBook logBook,
|
||||
QColor color_CQ, QColor color_MyCall,
|
||||
QColor color_DXCC, QColor color_NewCall)
|
||||
{
|
||||
QString bg="white";
|
||||
bool CQcall = false;
|
||||
if (decodedText.string ().contains (" CQ ")
|
||||
|| decodedText.string ().contains (" CQDX ")
|
||||
|| decodedText.string ().contains (" QRZ "))
|
||||
{
|
||||
CQcall = true;
|
||||
bg=color_CQ.name();
|
||||
}
|
||||
if (myCall != "" and (
|
||||
decodedText.indexOf (" " + myCall + " ") >= 0
|
||||
or decodedText.indexOf (" " + myCall + "/") >= 0
|
||||
or decodedText.indexOf ("/" + myCall + " ") >= 0
|
||||
or decodedText.indexOf ("<" + myCall + " ") >= 0
|
||||
or decodedText.indexOf (" " + myCall + ">") >= 0)) {
|
||||
bg=color_MyCall.name();
|
||||
}
|
||||
// if enabled add the DXCC entity and B4 status to the end of the
|
||||
// preformated text line t1
|
||||
auto message = decodedText.string ();
|
||||
if (displayDXCCEntity && CQcall)
|
||||
message = _appendDXCCWorkedB4 (message, decodedText.CQersCall (), &bg, logBook, color_CQ,
|
||||
color_DXCC, color_NewCall);
|
||||
appendText (message, bg);
|
||||
}
|
||||
|
||||
|
||||
void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 txFreq,
|
||||
QColor color_TxMsg, bool bFastMode)
|
||||
{
|
||||
QString bg=color_TxMsg.name();
|
||||
QString t1=" @ ";
|
||||
if(modeTx=="FT8") t1=" ~ ";
|
||||
if(modeTx=="JT4") t1=" $ ";
|
||||
if(modeTx=="JT65") t1=" # ";
|
||||
if(modeTx=="MSK144") t1=" & ";
|
||||
QString t2;
|
||||
t2.sprintf("%4d",txFreq);
|
||||
QString t;
|
||||
if(bFastMode or modeTx=="FT8") {
|
||||
t = QDateTime::currentDateTimeUtc().toString("hhmmss") + \
|
||||
" Tx " + t2 + t1 + text;
|
||||
} else {
|
||||
t = QDateTime::currentDateTimeUtc().toString("hhmm") + \
|
||||
" Tx " + t2 + t1 + text;
|
||||
}
|
||||
appendText(t,bg);
|
||||
}
|
||||
|
||||
void DisplayText::displayQSY(QString text)
|
||||
{
|
||||
QString t = QDateTime::currentDateTimeUtc().toString("hhmmss") + " " + text;
|
||||
QString bg="hot pink";
|
||||
appendText(t,bg);
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
|
||||
// Copyright Aleksey Gurtovoy 2000-2004
|
||||
//
|
||||
// Distributed under 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)
|
||||
//
|
||||
|
||||
// Preprocessed version of "boost/mpl/and.hpp" header
|
||||
// -- DO NOT modify by hand!
|
||||
|
||||
namespace boost { namespace mpl {
|
||||
|
||||
namespace aux {
|
||||
|
||||
template< bool C_, typename T1, typename T2, typename T3, typename T4 >
|
||||
struct and_impl
|
||||
: false_
|
||||
{
|
||||
};
|
||||
|
||||
template< typename T1, typename T2, typename T3, typename T4 >
|
||||
struct and_impl< true,T1,T2,T3,T4 >
|
||||
: and_impl<
|
||||
BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
|
||||
, T2, T3, T4
|
||||
, true_
|
||||
>
|
||||
{
|
||||
};
|
||||
|
||||
template<>
|
||||
struct and_impl<
|
||||
true
|
||||
, true_, true_, true_, true_
|
||||
>
|
||||
: true_
|
||||
{
|
||||
};
|
||||
|
||||
} // namespace aux
|
||||
|
||||
template<
|
||||
typename BOOST_MPL_AUX_NA_PARAM(T1)
|
||||
, typename BOOST_MPL_AUX_NA_PARAM(T2)
|
||||
, typename T3 = true_, typename T4 = true_, typename T5 = true_
|
||||
>
|
||||
struct and_
|
||||
|
||||
: aux::and_impl<
|
||||
BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
|
||||
, T2, T3, T4, T5
|
||||
>
|
||||
|
||||
{
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(
|
||||
5
|
||||
, and_
|
||||
, ( T1, T2, T3, T4, T5)
|
||||
)
|
||||
};
|
||||
|
||||
BOOST_MPL_AUX_NA_SPEC2(
|
||||
2
|
||||
, 5
|
||||
, and_
|
||||
)
|
||||
|
||||
}}
|
||||
@@ -0,0 +1,30 @@
|
||||
// (c) Copyright Fernando Luis Cacciola Carballal 2000-2004
|
||||
// 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)
|
||||
|
||||
// See library home page at http://www.boost.org/libs/numeric/conversion
|
||||
//
|
||||
// Contact the author at: fernando_cacciola@hotmail.com
|
||||
//
|
||||
#ifndef BOOST_NUMERIC_CONVERSION_SIGN_MIXTURE_FLC_12NOV2002_HPP
|
||||
#define BOOST_NUMERIC_CONVERSION_SIGN_MIXTURE_FLC_12NOV2002_HPP
|
||||
|
||||
#include "boost/numeric/conversion/detail/sign_mixture.hpp"
|
||||
|
||||
namespace boost { namespace numeric
|
||||
{
|
||||
|
||||
template<class T, class S>
|
||||
struct sign_mixture
|
||||
: convdetail::get_sign_mixture< BOOST_DEDUCED_TYPENAME remove_cv<T>::type
|
||||
,BOOST_DEDUCED_TYPENAME remove_cv<S>::type
|
||||
>::type {} ;
|
||||
|
||||
} } // namespace boost::numeric
|
||||
|
||||
#endif
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
# /* **************************************************************************
|
||||
# * *
|
||||
# * (C) Copyright Paul Mensonides 2002.
|
||||
# * Distributed under 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)
|
||||
# * *
|
||||
# ************************************************************************** */
|
||||
#
|
||||
# /* See http://www.boost.org for most recent version. */
|
||||
#
|
||||
# ifndef BOOST_PREPROCESSOR_COMMA_HPP
|
||||
# define BOOST_PREPROCESSOR_COMMA_HPP
|
||||
#
|
||||
# include <boost/preprocessor/punctuation/comma.hpp>
|
||||
#
|
||||
# endif
|
||||
@@ -0,0 +1,107 @@
|
||||
// Copyright (C) 2006 Douglas Gregor <doug.gregor -at- gmail.com>.
|
||||
|
||||
// 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)
|
||||
|
||||
/** @file status.hpp
|
||||
*
|
||||
* This header defines the class @c status, which reports on the
|
||||
* results of point-to-point communication.
|
||||
*/
|
||||
#ifndef BOOST_MPI_STATUS_HPP
|
||||
#define BOOST_MPI_STATUS_HPP
|
||||
|
||||
#include <boost/mpi/config.hpp>
|
||||
#include <boost/optional.hpp>
|
||||
|
||||
namespace boost { namespace mpi {
|
||||
|
||||
class request;
|
||||
class communicator;
|
||||
|
||||
/** @brief Contains information about a message that has been or can
|
||||
* be received.
|
||||
*
|
||||
* This structure contains status information about messages that
|
||||
* have been received (with @c communicator::recv) or can be received
|
||||
* (returned from @c communicator::probe or @c
|
||||
* communicator::iprobe). It permits access to the source of the
|
||||
* message, message tag, error code (rarely used), or the number of
|
||||
* elements that have been transmitted.
|
||||
*/
|
||||
class BOOST_MPI_DECL status
|
||||
{
|
||||
public:
|
||||
status() : m_count(-1) { }
|
||||
|
||||
status(MPI_Status const& s) : m_status(s), m_count(-1) {}
|
||||
|
||||
/**
|
||||
* Retrieve the source of the message.
|
||||
*/
|
||||
int source() const { return m_status.MPI_SOURCE; }
|
||||
|
||||
/**
|
||||
* Retrieve the message tag.
|
||||
*/
|
||||
int tag() const { return m_status.MPI_TAG; }
|
||||
|
||||
/**
|
||||
* Retrieve the error code.
|
||||
*/
|
||||
int error() const { return m_status.MPI_ERROR; }
|
||||
|
||||
/**
|
||||
* Determine whether the communication associated with this object
|
||||
* has been successfully cancelled.
|
||||
*/
|
||||
bool cancelled() const;
|
||||
|
||||
/**
|
||||
* Determines the number of elements of type @c T contained in the
|
||||
* message. The type @c T must have an associated data type, i.e.,
|
||||
* @c is_mpi_datatype<T> must derive @c mpl::true_. In cases where
|
||||
* the type @c T does not match the transmitted type, this routine
|
||||
* will return an empty @c optional<int>.
|
||||
*
|
||||
* @returns the number of @c T elements in the message, if it can be
|
||||
* determined.
|
||||
*/
|
||||
template<typename T> optional<int> count() const;
|
||||
|
||||
/**
|
||||
* References the underlying @c MPI_Status
|
||||
*/
|
||||
operator MPI_Status&() { return m_status; }
|
||||
|
||||
/**
|
||||
* References the underlying @c MPI_Status
|
||||
*/
|
||||
operator const MPI_Status&() const { return m_status; }
|
||||
|
||||
private:
|
||||
/**
|
||||
* INTERNAL ONLY
|
||||
*/
|
||||
template<typename T> optional<int> count_impl(mpl::true_) const;
|
||||
|
||||
/**
|
||||
* INTERNAL ONLY
|
||||
*/
|
||||
template<typename T> optional<int> count_impl(mpl::false_) const;
|
||||
|
||||
public: // friend templates are not portable
|
||||
|
||||
/// INTERNAL ONLY
|
||||
mutable MPI_Status m_status;
|
||||
mutable int m_count;
|
||||
|
||||
friend class communicator;
|
||||
friend class request;
|
||||
};
|
||||
|
||||
|
||||
} } // end namespace boost::mpi
|
||||
|
||||
#endif // BOOST_MPI_STATUS_HPP
|
||||
@@ -0,0 +1,17 @@
|
||||
<style>
|
||||
html, body {
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: Georgia, "Times New Roman", Times, serif;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: purple;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,72 @@
|
||||
// Copyright David Abrahams 2002.
|
||||
// Distributed under 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)
|
||||
#ifndef MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP
|
||||
# define MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP
|
||||
|
||||
# include <boost/python/make_function.hpp>
|
||||
# include <boost/python/args_fwd.hpp>
|
||||
|
||||
# include <boost/python/object/make_holder.hpp>
|
||||
|
||||
# include <boost/mpl/size.hpp>
|
||||
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
// Think of this as a version of make_function without a compile-time
|
||||
// check that the size of kw is no greater than the expected arity of
|
||||
// F. This version is needed when defining functions with default
|
||||
// arguments, because compile-time information about the number of
|
||||
// keywords is missing for all but the initial function definition.
|
||||
//
|
||||
// @group make_keyword_range_function {
|
||||
template <class F, class Policies>
|
||||
object make_keyword_range_function(
|
||||
F f
|
||||
, Policies const& policies
|
||||
, keyword_range const& kw)
|
||||
{
|
||||
return detail::make_function_aux(
|
||||
f, policies, detail::get_signature(f), kw, mpl::int_<0>());
|
||||
}
|
||||
|
||||
template <class F, class Policies, class Signature>
|
||||
object make_keyword_range_function(
|
||||
F f
|
||||
, Policies const& policies
|
||||
, keyword_range const& kw
|
||||
, Signature const& sig)
|
||||
{
|
||||
return detail::make_function_aux(
|
||||
f, policies, sig, kw, mpl::int_<0>());
|
||||
}
|
||||
// }
|
||||
|
||||
// Builds an '__init__' function which inserts the given Holder type
|
||||
// in a wrapped C++ class instance. ArgList is an MPL type sequence
|
||||
// describing the C++ argument types to be passed to Holder's
|
||||
// constructor.
|
||||
//
|
||||
// Holder and ArgList are intended to be explicitly specified.
|
||||
template <class ArgList, class Arity, class Holder, class CallPolicies>
|
||||
object make_keyword_range_constructor(
|
||||
CallPolicies const& policies // The CallPolicies with which to invoke the Holder's constructor
|
||||
, detail::keyword_range const& kw // The (possibly empty) set of associated argument keywords
|
||||
, Holder* = 0
|
||||
, ArgList* = 0, Arity* = 0)
|
||||
{
|
||||
#if !defined( BOOST_PYTHON_NO_PY_SIGNATURES) && defined( BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE)
|
||||
python_class<BOOST_DEDUCED_TYPENAME Holder::value_type>::register_();
|
||||
#endif
|
||||
return detail::make_keyword_range_function(
|
||||
objects::make_holder<Arity::value>
|
||||
::template apply<Holder,ArgList>::execute
|
||||
, policies
|
||||
, kw);
|
||||
}
|
||||
|
||||
}}} // namespace boost::python::detail
|
||||
|
||||
#endif // MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP
|
||||
@@ -0,0 +1,44 @@
|
||||
|
||||
#ifndef BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED
|
||||
#define BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED
|
||||
|
||||
// Copyright Aleksey Gurtovoy 2000-2004
|
||||
//
|
||||
// Distributed under 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)
|
||||
//
|
||||
// See http://www.boost.org/libs/mpl for documentation.
|
||||
|
||||
// $Id$
|
||||
// $Date$
|
||||
// $Revision$
|
||||
|
||||
#if !defined(BOOST_MPL_PREPROCESSING_MODE)
|
||||
# include <boost/mpl/next_prior.hpp>
|
||||
# include <boost/mpl/deref.hpp>
|
||||
# include <boost/mpl/apply.hpp>
|
||||
# include <boost/mpl/aux_/config/ctps.hpp>
|
||||
# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
|
||||
|| defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/type_traits/is_same.hpp>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <boost/mpl/aux_/config/use_preprocessed.hpp>
|
||||
|
||||
#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
|
||||
&& !defined(BOOST_MPL_PREPROCESSING_MODE)
|
||||
|
||||
# define BOOST_MPL_PREPROCESSED_HEADER reverse_fold_impl.hpp
|
||||
# include <boost/mpl/aux_/include_preprocessed.hpp>
|
||||
|
||||
#else
|
||||
|
||||
# define AUX778076_FOLD_IMPL_OP(iter) typename deref<iter>::type
|
||||
# define AUX778076_FOLD_IMPL_NAME_PREFIX reverse_fold
|
||||
# include <boost/mpl/aux_/reverse_fold_impl_body.hpp>
|
||||
|
||||
#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
|
||||
#endif // BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED
|
||||
@@ -0,0 +1,21 @@
|
||||
# /* **************************************************************************
|
||||
# * *
|
||||
# * (C) Copyright Paul Mensonides 2002.
|
||||
# * Distributed under 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)
|
||||
# * *
|
||||
# ************************************************************************** */
|
||||
#
|
||||
# /* See http://www.boost.org for most recent version. */
|
||||
#
|
||||
# if !defined(BOOST_PP_INDIRECT_SELF)
|
||||
# error BOOST_PP_ERROR: no indirect file to include
|
||||
# endif
|
||||
#
|
||||
# define BOOST_PP_IS_SELFISH 1
|
||||
#
|
||||
# include BOOST_PP_INDIRECT_SELF
|
||||
#
|
||||
# undef BOOST_PP_IS_SELFISH
|
||||
# undef BOOST_PP_INDIRECT_SELF
|
||||
@@ -0,0 +1,746 @@
|
||||
//=======================================================================
|
||||
// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
|
||||
// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
|
||||
//
|
||||
// Distributed under 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)
|
||||
//=======================================================================
|
||||
|
||||
#ifndef BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
|
||||
#define BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
|
||||
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#include <boost/limits.hpp>
|
||||
#include <boost/ref.hpp>
|
||||
#include <boost/utility/result_of.hpp>
|
||||
#include <boost/preprocessor.hpp>
|
||||
#include <boost/parameter/name.hpp>
|
||||
#include <boost/parameter/binding.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
#include <boost/mpl/not.hpp>
|
||||
#include <boost/graph/properties.hpp>
|
||||
#include <boost/graph/detail/d_ary_heap.hpp>
|
||||
#include <boost/property_map/property_map.hpp>
|
||||
#include <boost/property_map/shared_array_property_map.hpp>
|
||||
|
||||
namespace boost {
|
||||
|
||||
struct parity_map_t { };
|
||||
struct vertex_assignment_map_t { };
|
||||
struct distance_compare_t { };
|
||||
struct distance_combine_t { };
|
||||
struct distance_inf_t { };
|
||||
struct distance_zero_t { };
|
||||
struct buffer_param_t { };
|
||||
struct edge_copy_t { };
|
||||
struct vertex_copy_t { };
|
||||
struct vertex_isomorphism_t { };
|
||||
struct vertex_invariant_t { };
|
||||
struct vertex_invariant1_t { };
|
||||
struct vertex_invariant2_t { };
|
||||
struct edge_compare_t { };
|
||||
struct vertex_max_invariant_t { };
|
||||
struct orig_to_copy_t { };
|
||||
struct root_vertex_t { };
|
||||
struct polling_t { };
|
||||
struct lookahead_t { };
|
||||
struct in_parallel_t { };
|
||||
struct attractive_force_t { };
|
||||
struct repulsive_force_t { };
|
||||
struct force_pairs_t { };
|
||||
struct cooling_t { };
|
||||
struct vertex_displacement_t { };
|
||||
struct iterations_t { };
|
||||
struct diameter_range_t { };
|
||||
struct learning_constant_range_t { };
|
||||
struct vertices_equivalent_t { };
|
||||
struct edges_equivalent_t { };
|
||||
struct index_in_heap_map_t { };
|
||||
struct max_priority_queue_t { };
|
||||
|
||||
#define BOOST_BGL_DECLARE_NAMED_PARAMS \
|
||||
BOOST_BGL_ONE_PARAM_CREF(weight_map, edge_weight) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(weight_map2, edge_weight2) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(distance_map, vertex_distance) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(distance_map2, vertex_distance2) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(predecessor_map, vertex_predecessor) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(rank_map, vertex_rank) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(root_map, vertex_root) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(root_vertex, root_vertex) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(edge_centrality_map, edge_centrality) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(centrality_map, vertex_centrality) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(parity_map, parity_map) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(color_map, vertex_color) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(edge_color_map, edge_color) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(capacity_map, edge_capacity) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(residual_capacity_map, edge_residual_capacity) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(reverse_edge_map, edge_reverse) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(discover_time_map, vertex_discover_time) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(lowpoint_map, vertex_lowpoint) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_index_map, vertex_index) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_index1_map, vertex_index1) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_index2_map, vertex_index2) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_assignment_map, vertex_assignment_map) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(visitor, graph_visitor) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(distance_compare, distance_compare) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(distance_combine, distance_combine) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(distance_inf, distance_inf) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(distance_zero, distance_zero) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(edge_copy, edge_copy) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_copy, vertex_copy) \
|
||||
BOOST_BGL_ONE_PARAM_REF(buffer, buffer_param) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(orig_to_copy, orig_to_copy) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(isomorphism_map, vertex_isomorphism) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_invariant, vertex_invariant) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_invariant1, vertex_invariant1) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_invariant2, vertex_invariant2) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertex_max_invariant, vertex_max_invariant) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(polling, polling) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(lookahead, lookahead) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(in_parallel, in_parallel) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(displacement_map, vertex_displacement) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(attractive_force, attractive_force) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(repulsive_force, repulsive_force) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(force_pairs, force_pairs) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(cooling, cooling) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(iterations, iterations) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(diameter_range, diameter_range) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(learning_constant_range, learning_constant_range) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(vertices_equivalent, vertices_equivalent) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(edges_equivalent, edges_equivalent) \
|
||||
BOOST_BGL_ONE_PARAM_CREF(index_in_heap_map, index_in_heap_map) \
|
||||
BOOST_BGL_ONE_PARAM_REF(max_priority_queue, max_priority_queue)
|
||||
|
||||
template <typename T, typename Tag, typename Base = no_property>
|
||||
struct bgl_named_params
|
||||
{
|
||||
typedef bgl_named_params self;
|
||||
typedef Base next_type;
|
||||
typedef Tag tag_type;
|
||||
typedef T value_type;
|
||||
bgl_named_params(T v = T()) : m_value(v) { }
|
||||
bgl_named_params(T v, const Base& b) : m_value(v), m_base(b) { }
|
||||
T m_value;
|
||||
Base m_base;
|
||||
|
||||
#define BOOST_BGL_ONE_PARAM_REF(name, key) \
|
||||
template <typename PType> \
|
||||
bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t), self> \
|
||||
name(PType& p) const { \
|
||||
typedef bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t), self> Params; \
|
||||
return Params(boost::ref(p), *this); \
|
||||
} \
|
||||
|
||||
#define BOOST_BGL_ONE_PARAM_CREF(name, key) \
|
||||
template <typename PType> \
|
||||
bgl_named_params<PType, BOOST_PP_CAT(key, _t), self> \
|
||||
name(const PType& p) const { \
|
||||
typedef bgl_named_params<PType, BOOST_PP_CAT(key, _t), self> Params; \
|
||||
return Params(p, *this); \
|
||||
} \
|
||||
|
||||
BOOST_BGL_DECLARE_NAMED_PARAMS
|
||||
|
||||
#undef BOOST_BGL_ONE_PARAM_REF
|
||||
#undef BOOST_BGL_ONE_PARAM_CREF
|
||||
|
||||
// Duplicate
|
||||
template <typename PType>
|
||||
bgl_named_params<PType, vertex_color_t, self>
|
||||
vertex_color_map(const PType& p) const {return this->color_map(p);}
|
||||
};
|
||||
|
||||
#define BOOST_BGL_ONE_PARAM_REF(name, key) \
|
||||
template <typename PType> \
|
||||
bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t)> \
|
||||
name(PType& p) { \
|
||||
typedef bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t)> Params; \
|
||||
return Params(boost::ref(p)); \
|
||||
} \
|
||||
|
||||
#define BOOST_BGL_ONE_PARAM_CREF(name, key) \
|
||||
template <typename PType> \
|
||||
bgl_named_params<PType, BOOST_PP_CAT(key, _t)> \
|
||||
name(const PType& p) { \
|
||||
typedef bgl_named_params<PType, BOOST_PP_CAT(key, _t)> Params; \
|
||||
return Params(p); \
|
||||
} \
|
||||
|
||||
BOOST_BGL_DECLARE_NAMED_PARAMS
|
||||
|
||||
#undef BOOST_BGL_ONE_PARAM_REF
|
||||
#undef BOOST_BGL_ONE_PARAM_CREF
|
||||
|
||||
// Duplicate
|
||||
template <typename PType>
|
||||
bgl_named_params<PType, vertex_color_t>
|
||||
vertex_color_map(const PType& p) {return color_map(p);}
|
||||
|
||||
namespace detail {
|
||||
struct unused_tag_type {};
|
||||
}
|
||||
typedef bgl_named_params<char, detail::unused_tag_type> no_named_parameters;
|
||||
|
||||
//===========================================================================
|
||||
// Functions for extracting parameters from bgl_named_params
|
||||
|
||||
template <typename Tag, typename Args>
|
||||
struct lookup_named_param {};
|
||||
|
||||
template <typename T, typename Tag, typename Base>
|
||||
struct lookup_named_param<Tag, bgl_named_params<T, Tag, Base> > {
|
||||
typedef T type;
|
||||
static const T& get(const bgl_named_params<T, Tag, Base>& p) {
|
||||
return p.m_value;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Tag1, typename T, typename Tag, typename Base>
|
||||
struct lookup_named_param<Tag1, bgl_named_params<T, Tag, Base> > {
|
||||
typedef typename lookup_named_param<Tag1, Base>::type type;
|
||||
static const type& get(const bgl_named_params<T, Tag, Base>& p) {
|
||||
return lookup_named_param<Tag1, Base>::get(p.m_base);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Tag, typename Args, typename Def>
|
||||
struct lookup_named_param_def {
|
||||
typedef Def type;
|
||||
static const Def& get(const Args&, const Def& def) {return def;}
|
||||
};
|
||||
|
||||
template <typename T, typename Tag, typename Base, typename Def>
|
||||
struct lookup_named_param_def<Tag, bgl_named_params<T, Tag, Base>, Def> {
|
||||
typedef T type;
|
||||
static const type& get(const bgl_named_params<T, Tag, Base>& p, const Def&) {
|
||||
return p.m_value;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Tag1, typename T, typename Tag, typename Base, typename Def>
|
||||
struct lookup_named_param_def<Tag1, bgl_named_params<T, Tag, Base>, Def> {
|
||||
typedef typename lookup_named_param_def<Tag1, Base, Def>::type type;
|
||||
static const type& get(const bgl_named_params<T, Tag, Base>& p, const Def& def) {
|
||||
return lookup_named_param_def<Tag1, Base, Def>::get(p.m_base, def);
|
||||
}
|
||||
};
|
||||
|
||||
struct param_not_found {};
|
||||
|
||||
template <typename Tag, typename Args>
|
||||
struct get_param_type:
|
||||
lookup_named_param_def<Tag, Args, param_not_found> {};
|
||||
|
||||
template <class Tag, typename Args>
|
||||
inline
|
||||
const typename lookup_named_param_def<Tag, Args, param_not_found>::type&
|
||||
get_param(const Args& p, Tag) {
|
||||
return lookup_named_param_def<Tag, Args, param_not_found>::get(p, param_not_found());
|
||||
}
|
||||
|
||||
template <class P, class Default>
|
||||
const P& choose_param(const P& param, const Default&) {
|
||||
return param;
|
||||
}
|
||||
|
||||
template <class Default>
|
||||
Default choose_param(const param_not_found&, const Default& d) {
|
||||
return d;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool is_default_param(const T&) { return false; }
|
||||
|
||||
inline bool is_default_param(const param_not_found&)
|
||||
{ return true; }
|
||||
|
||||
namespace detail {
|
||||
template <typename T>
|
||||
struct const_type_as_type {typedef typename T::const_type type;};
|
||||
} // namespace detail
|
||||
|
||||
|
||||
// Use this function instead of choose_param() when you want
|
||||
// to avoid requiring get(tag, g) when it is not used.
|
||||
namespace detail {
|
||||
template <typename GraphIsConst, typename Graph, typename Param, typename Tag>
|
||||
struct choose_impl_result:
|
||||
boost::mpl::eval_if<
|
||||
boost::is_same<Param, param_not_found>,
|
||||
boost::mpl::eval_if<
|
||||
GraphIsConst,
|
||||
detail::const_type_as_type<property_map<Graph, Tag> >,
|
||||
property_map<Graph, Tag> >,
|
||||
boost::mpl::identity<Param> > {};
|
||||
|
||||
// Parameters of f are (GraphIsConst, Graph, Param, Tag)
|
||||
template <bool Found> struct choose_impl_helper;
|
||||
|
||||
template <> struct choose_impl_helper<false> {
|
||||
template <typename Param, typename Graph, typename PropertyTag>
|
||||
static typename property_map<typename boost::remove_const<Graph>::type, PropertyTag>::const_type
|
||||
f(boost::mpl::true_, const Graph& g, const Param&, PropertyTag tag) {
|
||||
return get(tag, g);
|
||||
}
|
||||
|
||||
template <typename Param, typename Graph, typename PropertyTag>
|
||||
static typename property_map<typename boost::remove_const<Graph>::type, PropertyTag>::type
|
||||
f(boost::mpl::false_, Graph& g, const Param&, PropertyTag tag) {
|
||||
return get(tag, g);
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct choose_impl_helper<true> {
|
||||
template <typename GraphIsConst, typename Param, typename Graph, typename PropertyTag>
|
||||
static Param f(GraphIsConst, const Graph&, const Param& p, PropertyTag) {
|
||||
return p;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
template <typename Param, typename Graph, typename PropertyTag>
|
||||
typename detail::choose_impl_result<boost::mpl::true_, Graph, Param, PropertyTag>::type
|
||||
choose_const_pmap(const Param& p, const Graph& g, PropertyTag tag)
|
||||
{
|
||||
return detail::choose_impl_helper<!boost::is_same<Param, param_not_found>::value>
|
||||
::f(boost::mpl::true_(), g, p, tag);
|
||||
}
|
||||
|
||||
template <typename Param, typename Graph, typename PropertyTag>
|
||||
typename detail::choose_impl_result<boost::mpl::false_, Graph, Param, PropertyTag>::type
|
||||
choose_pmap(const Param& p, Graph& g, PropertyTag tag)
|
||||
{
|
||||
return detail::choose_impl_helper<!boost::is_same<Param, param_not_found>::value>
|
||||
::f(boost::mpl::false_(), g, p, tag);
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
// used in the max-flow algorithms
|
||||
template <class Graph, class P, class T, class R>
|
||||
struct edge_capacity_value
|
||||
{
|
||||
typedef bgl_named_params<P, T, R> Params;
|
||||
typedef typename detail::choose_impl_result<boost::mpl::true_, Graph, typename get_param_type<edge_capacity_t, Params>::type, edge_capacity_t>::type CapacityEdgeMap;
|
||||
typedef typename property_traits<CapacityEdgeMap>::value_type type;
|
||||
};
|
||||
// used in the max-flow algorithms
|
||||
template <class Graph, class P, class T, class R>
|
||||
struct edge_weight_value
|
||||
{
|
||||
typedef bgl_named_params<P, T, R> Params;
|
||||
typedef typename detail::choose_impl_result<boost::mpl::true_, Graph, typename get_param_type<edge_weight_t, Params>::type, edge_weight_t>::type WeightMap;
|
||||
typedef typename property_traits<WeightMap>::value_type type;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
// Declare all new tags
|
||||
namespace graph {
|
||||
namespace keywords {
|
||||
#define BOOST_BGL_ONE_PARAM_REF(name, key) BOOST_PARAMETER_NAME(name)
|
||||
#define BOOST_BGL_ONE_PARAM_CREF(name, key) BOOST_PARAMETER_NAME(name)
|
||||
BOOST_BGL_DECLARE_NAMED_PARAMS
|
||||
#undef BOOST_BGL_ONE_PARAM_REF
|
||||
#undef BOOST_BGL_ONE_PARAM_CREF
|
||||
}
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
template <typename Tag> struct convert_one_keyword {};
|
||||
#define BOOST_BGL_ONE_PARAM_REF(name, key) \
|
||||
template <> \
|
||||
struct convert_one_keyword<BOOST_PP_CAT(key, _t)> { \
|
||||
typedef boost::graph::keywords::tag::name type; \
|
||||
};
|
||||
#define BOOST_BGL_ONE_PARAM_CREF(name, key) BOOST_BGL_ONE_PARAM_REF(name, key)
|
||||
BOOST_BGL_DECLARE_NAMED_PARAMS
|
||||
#undef BOOST_BGL_ONE_PARAM_REF
|
||||
#undef BOOST_BGL_ONE_PARAM_CREF
|
||||
|
||||
template <typename T>
|
||||
struct convert_bgl_params_to_boost_parameter {
|
||||
typedef typename convert_one_keyword<typename T::tag_type>::type new_kw;
|
||||
typedef boost::parameter::aux::tagged_argument<new_kw, const typename T::value_type> tagged_arg_type;
|
||||
typedef convert_bgl_params_to_boost_parameter<typename T::next_type> rest_conv;
|
||||
typedef boost::parameter::aux::arg_list<tagged_arg_type, typename rest_conv::type> type;
|
||||
static type conv(const T& x) {
|
||||
return type(tagged_arg_type(x.m_value), rest_conv::conv(x.m_base));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename P, typename R>
|
||||
struct convert_bgl_params_to_boost_parameter<bgl_named_params<P, int, R> > {
|
||||
typedef convert_bgl_params_to_boost_parameter<R> rest_conv;
|
||||
typedef typename rest_conv::type type;
|
||||
static type conv(const bgl_named_params<P, int, R>& x) {
|
||||
return rest_conv::conv(x.m_base);
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct convert_bgl_params_to_boost_parameter<boost::no_property> {
|
||||
typedef boost::parameter::aux::empty_arg_list type;
|
||||
static type conv(const boost::no_property&) {return type();}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct convert_bgl_params_to_boost_parameter<boost::no_named_parameters> {
|
||||
typedef boost::parameter::aux::empty_arg_list type;
|
||||
static type conv(const boost::no_named_parameters&) {return type();}
|
||||
};
|
||||
|
||||
struct bgl_parameter_not_found_type {};
|
||||
|
||||
template <typename ArgPack, typename KeywordType>
|
||||
struct parameter_exists : boost::mpl::not_<boost::is_same<typename boost::parameter::binding<ArgPack, KeywordType, bgl_parameter_not_found_type>::type, bgl_parameter_not_found_type> > {};
|
||||
}
|
||||
|
||||
#define BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(old_type, old_var) \
|
||||
typedef typename boost::detail::convert_bgl_params_to_boost_parameter<old_type>::type arg_pack_type; \
|
||||
arg_pack_type arg_pack = boost::detail::convert_bgl_params_to_boost_parameter<old_type>::conv(old_var);
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename ArgType, typename Prop, typename Graph, bool Exists>
|
||||
struct override_const_property_t {
|
||||
typedef typename boost::remove_const<ArgType>::type result_type;
|
||||
result_type operator()(const Graph&, const ArgType& a) const {return a;}
|
||||
};
|
||||
|
||||
template <typename ArgType, typename Prop, typename Graph>
|
||||
struct override_const_property_t<ArgType, Prop, Graph, false> {
|
||||
typedef typename boost::property_map<Graph, Prop>::const_type result_type;
|
||||
result_type operator()(const Graph& g, const ArgType&) const {return get(Prop(), g);}
|
||||
};
|
||||
|
||||
template <typename ArgPack, typename Tag, typename Prop, typename Graph>
|
||||
struct override_const_property_result {
|
||||
typedef
|
||||
typename override_const_property_t<
|
||||
typename boost::parameter::value_type<ArgPack, Tag, int>::type,
|
||||
Prop,
|
||||
Graph,
|
||||
boost::detail::parameter_exists<ArgPack, Tag>::value
|
||||
>::result_type
|
||||
type;
|
||||
};
|
||||
|
||||
template <typename ArgPack, typename Tag, typename Prop, typename Graph>
|
||||
typename override_const_property_result<ArgPack, Tag, Prop, Graph>::type
|
||||
override_const_property(const ArgPack& ap, const boost::parameter::keyword<Tag>& t, const Graph& g, Prop) {
|
||||
return override_const_property_t<
|
||||
typename boost::parameter::value_type<ArgPack, Tag, int>::type,
|
||||
Prop,
|
||||
Graph,
|
||||
boost::detail::parameter_exists<ArgPack, Tag>::value
|
||||
>()(g, ap[t | 0]);
|
||||
}
|
||||
|
||||
template <typename ArgType, typename Prop, typename Graph, bool Exists>
|
||||
struct override_property_t {
|
||||
typedef ArgType result_type;
|
||||
result_type operator()(const Graph&, const typename boost::add_reference<ArgType>::type a) const {return a;}
|
||||
};
|
||||
|
||||
template <typename ArgType, typename Prop, typename Graph>
|
||||
struct override_property_t<ArgType, Prop, Graph, false> {
|
||||
typedef typename boost::property_map<Graph, Prop>::type result_type;
|
||||
result_type operator()(const Graph& g, const ArgType&) const {return get(Prop(), g);}
|
||||
};
|
||||
|
||||
template <typename ArgPack, typename Tag, typename Prop, typename Graph>
|
||||
struct override_property_result {
|
||||
typedef
|
||||
typename override_property_t<
|
||||
typename boost::parameter::value_type<ArgPack, Tag, int>::type,
|
||||
Prop,
|
||||
Graph,
|
||||
boost::detail::parameter_exists<ArgPack, Tag>::value
|
||||
>::result_type
|
||||
type;
|
||||
};
|
||||
|
||||
template <typename ArgPack, typename Tag, typename Prop, typename Graph>
|
||||
typename override_property_result<ArgPack, Tag, Prop, Graph>::type
|
||||
override_property(const ArgPack& ap, const boost::parameter::keyword<Tag>& t, const Graph& g, Prop) {
|
||||
return override_property_t<
|
||||
typename boost::parameter::value_type<ArgPack, Tag, int>::type,
|
||||
Prop,
|
||||
Graph,
|
||||
boost::detail::parameter_exists<ArgPack, Tag>::value
|
||||
>()(g, ap[t | 0]);
|
||||
}
|
||||
|
||||
template <typename F> struct make_arg_pack_type;
|
||||
template <> struct make_arg_pack_type<void()> {typedef boost::parameter::aux::empty_arg_list type;};
|
||||
template <typename K, typename A>
|
||||
struct make_arg_pack_type<void(K, A)> {
|
||||
typedef boost::parameter::aux::tagged_argument<K, A> type;
|
||||
};
|
||||
|
||||
#define BOOST_GRAPH_OPENING_PART_OF_PAIR(z, i, n) boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<BOOST_PP_CAT(Keyword, BOOST_PP_SUB(n, i)), BOOST_PP_CAT(Arg, BOOST_PP_SUB(n, i))>,
|
||||
#define BOOST_GRAPH_MAKE_PAIR_PARAM(z, i, _) const boost::parameter::aux::tagged_argument<BOOST_PP_CAT(Keyword, i), BOOST_PP_CAT(Arg, i)>& BOOST_PP_CAT(kw, i)
|
||||
|
||||
#define BOOST_GRAPH_MAKE_AP_TYPE_SPECIALIZATION(z, i, _) \
|
||||
template <BOOST_PP_ENUM_PARAMS(i, typename Keyword), BOOST_PP_ENUM_PARAMS(i, typename Arg)> \
|
||||
struct make_arg_pack_type<void(BOOST_PP_ENUM_PARAMS(i, Keyword), BOOST_PP_ENUM_PARAMS(i, Arg))> { \
|
||||
typedef \
|
||||
BOOST_PP_REPEAT(i, BOOST_GRAPH_OPENING_PART_OF_PAIR, BOOST_PP_DEC(i)) boost::parameter::aux::empty_arg_list BOOST_PP_REPEAT(i, > BOOST_PP_TUPLE_EAT(3), ~) \
|
||||
type; \
|
||||
};
|
||||
BOOST_PP_REPEAT_FROM_TO(2, 11, BOOST_GRAPH_MAKE_AP_TYPE_SPECIALIZATION, ~)
|
||||
#undef BOOST_GRAPH_MAKE_AP_TYPE_SPECIALIZATION
|
||||
|
||||
#define BOOST_GRAPH_MAKE_FORWARDING_FUNCTION(name, nfixed, nnamed_max) \
|
||||
/* Entry point for conversion from BGL-style named parameters */ \
|
||||
template <BOOST_PP_ENUM_PARAMS(nfixed, typename Param) BOOST_PP_COMMA_IF(nfixed) typename ArgPack> \
|
||||
typename boost::result_of< \
|
||||
detail::BOOST_PP_CAT(name, _impl)<BOOST_PP_ENUM_PARAMS(nfixed, Param)>(BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) const ArgPack&) \
|
||||
>::type \
|
||||
BOOST_PP_CAT(name, _with_named_params)(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param) BOOST_PP_COMMA_IF(nfixed) const ArgPack& arg_pack) { \
|
||||
return detail::BOOST_PP_CAT(name, _impl)<BOOST_PP_ENUM_PARAMS(nfixed, Param)>()(BOOST_PP_ENUM_PARAMS(nfixed, param) BOOST_PP_COMMA_IF(nfixed) arg_pack); \
|
||||
} \
|
||||
/* Individual functions taking Boost.Parameter-style keyword arguments */ \
|
||||
BOOST_PP_REPEAT(BOOST_PP_INC(nnamed_max), BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONE, (name)(nfixed))
|
||||
|
||||
#define BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONE(z, nnamed, seq) \
|
||||
BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONEX(z, nnamed, BOOST_PP_SEQ_ELEM(0, seq), BOOST_PP_SEQ_ELEM(1, seq))
|
||||
|
||||
#define BOOST_GRAPH_MAKE_FORWARDING_FUNCTION_ONEX(z, nnamed, name, nfixed) \
|
||||
template <BOOST_PP_ENUM_PARAMS(nfixed, typename Param) BOOST_PP_ENUM_TRAILING_PARAMS(nnamed, typename Keyword) BOOST_PP_ENUM_TRAILING_PARAMS(nnamed, typename Arg)> \
|
||||
typename boost::result_of< \
|
||||
detail::BOOST_PP_CAT(name, _impl)<BOOST_PP_ENUM_PARAMS(nfixed, Param)> \
|
||||
(BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) \
|
||||
const typename boost::detail::make_arg_pack_type<void(BOOST_PP_ENUM_PARAMS(nnamed, Keyword) BOOST_PP_COMMA_IF(nnamed) BOOST_PP_ENUM_PARAMS(nnamed, Arg))>::type&) \
|
||||
>::type \
|
||||
name(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param) \
|
||||
BOOST_PP_ENUM_TRAILING(nnamed, BOOST_GRAPH_MAKE_PAIR_PARAM, ~)) { \
|
||||
return detail::BOOST_PP_CAT(name, _impl)<BOOST_PP_ENUM_PARAMS(nfixed, Param)>() \
|
||||
(BOOST_PP_ENUM_PARAMS(nfixed, param), \
|
||||
(boost::parameter::aux::empty_arg_list() BOOST_PP_ENUM_TRAILING_PARAMS(nnamed, kw))); \
|
||||
}
|
||||
|
||||
#define BOOST_GRAPH_MAKE_OLD_STYLE_PARAMETER_FUNCTION(name, nfixed) \
|
||||
template <BOOST_PP_ENUM_PARAMS(nfixed, typename Param) BOOST_PP_COMMA_IF(nfixed) class P, class T, class R> \
|
||||
typename boost::result_of< \
|
||||
::boost::graph::detail::BOOST_PP_CAT(name, _impl) BOOST_PP_EXPR_IF(nfixed, <) BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_EXPR_IF(nfixed, >) \
|
||||
(BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) \
|
||||
const typename boost::detail::convert_bgl_params_to_boost_parameter<boost::bgl_named_params<P, T, R> >::type &) \
|
||||
>::type \
|
||||
name(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param) BOOST_PP_COMMA_IF(nfixed) const boost::bgl_named_params<P, T, R>& old_style_params) { \
|
||||
typedef boost::bgl_named_params<P, T, R> old_style_params_type; \
|
||||
BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(old_style_params_type, old_style_params) \
|
||||
return ::boost::graph::BOOST_PP_CAT(name, _with_named_params)(BOOST_PP_ENUM_PARAMS(nfixed, param) BOOST_PP_COMMA_IF(nfixed) arg_pack); \
|
||||
} \
|
||||
\
|
||||
BOOST_PP_EXPR_IF(nfixed, template <) BOOST_PP_ENUM_PARAMS(nfixed, typename Param) BOOST_PP_EXPR_IF(nfixed, >) \
|
||||
BOOST_PP_EXPR_IF(nfixed, typename) boost::result_of< \
|
||||
::boost::graph::detail::BOOST_PP_CAT(name, _impl) BOOST_PP_EXPR_IF(nfixed, <) BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_EXPR_IF(nfixed, >) \
|
||||
(BOOST_PP_ENUM_PARAMS(nfixed, Param) BOOST_PP_COMMA_IF(nfixed) const boost::parameter::aux::empty_arg_list &) \
|
||||
>::type \
|
||||
name(BOOST_PP_ENUM_BINARY_PARAMS(nfixed, const Param, & param)) { \
|
||||
BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(boost::no_named_parameters, boost::no_named_parameters()) \
|
||||
return ::boost::graph::BOOST_PP_CAT(name, _with_named_params)(BOOST_PP_ENUM_PARAMS(nfixed, param) BOOST_PP_COMMA_IF(nfixed) arg_pack); \
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <bool Exists, typename Graph, typename ArgPack, typename Value, typename PM>
|
||||
struct map_maker_helper {
|
||||
typedef PM map_type;
|
||||
static PM make_map(const Graph&, Value, const PM& pm, const ArgPack&) {
|
||||
return pm;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Graph, typename ArgPack, typename Value, typename PM>
|
||||
struct map_maker_helper<false, Graph, ArgPack, Value, PM> {
|
||||
typedef typename boost::remove_const<
|
||||
typename override_const_property_t<
|
||||
typename boost::parameter::value_type<
|
||||
ArgPack, boost::graph::keywords::tag::vertex_index_map, int>::type,
|
||||
boost::vertex_index_t,
|
||||
Graph,
|
||||
boost::detail::parameter_exists<
|
||||
ArgPack, boost::graph::keywords::tag::vertex_index_map>::value
|
||||
>::result_type>::type vi_map_type;
|
||||
typedef
|
||||
boost::shared_array_property_map<Value, vi_map_type>
|
||||
map_type;
|
||||
static map_type make_map(const Graph& g,
|
||||
Value v,
|
||||
const PM&,
|
||||
const ArgPack& ap) {
|
||||
return make_shared_array_property_map(
|
||||
num_vertices(g),
|
||||
v,
|
||||
override_const_property(
|
||||
ap,
|
||||
boost::graph::keywords::_vertex_index_map,
|
||||
g, vertex_index));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Graph, typename ArgPack, typename MapTag, typename ValueType>
|
||||
struct map_maker {
|
||||
BOOST_STATIC_CONSTANT(
|
||||
bool,
|
||||
has_map =
|
||||
(parameter_exists<ArgPack, MapTag>
|
||||
::value));
|
||||
typedef map_maker_helper<has_map, Graph, ArgPack, ValueType,
|
||||
typename boost::remove_const<
|
||||
typename boost::parameter::value_type<
|
||||
ArgPack,
|
||||
MapTag,
|
||||
int
|
||||
>::type
|
||||
>::type> helper;
|
||||
typedef typename helper::map_type map_type;
|
||||
static map_type make_map(const Graph& g, const ArgPack& ap, ValueType default_value) {
|
||||
return helper::make_map(g, default_value, ap[::boost::parameter::keyword<MapTag>::instance | 0], ap);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename MapTag, typename ValueType = void>
|
||||
class make_property_map_from_arg_pack_gen {
|
||||
ValueType default_value;
|
||||
|
||||
public:
|
||||
make_property_map_from_arg_pack_gen(ValueType default_value)
|
||||
: default_value(default_value) {}
|
||||
|
||||
template <typename Graph, typename ArgPack>
|
||||
typename map_maker<Graph, ArgPack, MapTag, ValueType>::map_type
|
||||
operator()(const Graph& g, const ArgPack& ap) const {
|
||||
return map_maker<Graph, ArgPack, MapTag, ValueType>::make_map(g, ap, default_value);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename MapTag>
|
||||
class make_property_map_from_arg_pack_gen<MapTag, void> {
|
||||
public:
|
||||
template <typename ValueType, typename Graph, typename ArgPack>
|
||||
typename map_maker<Graph, ArgPack, MapTag, ValueType>::map_type
|
||||
operator()(const Graph& g, const ArgPack& ap, ValueType default_value) const {
|
||||
return map_maker<Graph, ArgPack, MapTag, ValueType>::make_map(g, ap, default_value);
|
||||
}
|
||||
};
|
||||
|
||||
static const
|
||||
make_property_map_from_arg_pack_gen<
|
||||
boost::graph::keywords::tag::color_map,
|
||||
default_color_type>
|
||||
make_color_map_from_arg_pack(white_color);
|
||||
|
||||
template <bool Exists, class Graph, class ArgPack, class KeyT, class ValueT, class KeyMapTag, class IndexInHeapMapTag, class Compare, class Q>
|
||||
struct priority_queue_maker_helper {
|
||||
typedef Q priority_queue_type;
|
||||
|
||||
static priority_queue_type
|
||||
make_queue(const Graph&, const ArgPack&, KeyT, const Q& q) {
|
||||
return q;
|
||||
}
|
||||
};
|
||||
|
||||
template <class Graph, class ArgPack, class KeyT, class ValueT, class KeyMapTag, class IndexInHeapMapTag, class Compare, class Q>
|
||||
struct priority_queue_maker_helper<false, Graph, ArgPack, KeyT, ValueT, KeyMapTag, IndexInHeapMapTag, Compare, Q> {
|
||||
typedef typename std::vector<ValueT>::size_type default_index_in_heap_type;
|
||||
typedef typename map_maker<Graph, ArgPack, IndexInHeapMapTag, default_index_in_heap_type>::helper::map_type index_in_heap_map;
|
||||
typedef boost::d_ary_heap_indirect<ValueT, 4, index_in_heap_map, typename map_maker<Graph, ArgPack, KeyMapTag, KeyT>::helper::map_type, Compare> priority_queue_type;
|
||||
|
||||
static priority_queue_type
|
||||
make_queue(const Graph& g, const ArgPack& ap, KeyT defaultKey, const Q&) {
|
||||
return priority_queue_type(
|
||||
map_maker<Graph, ArgPack, KeyMapTag, KeyT>::make_map(g, ap, defaultKey),
|
||||
map_maker<Graph, ArgPack, IndexInHeapMapTag, default_index_in_heap_type>::make_map(g, ap, typename boost::property_traits<index_in_heap_map>::value_type(-1))
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
template <class Graph, class ArgPack, class KeyT, class ValueT, class PriorityQueueTag, class KeyMapTag, class IndexInHeapMapTag, class Compare>
|
||||
struct priority_queue_maker {
|
||||
BOOST_STATIC_CONSTANT(
|
||||
bool,
|
||||
g_hasQ =
|
||||
(parameter_exists<ArgPack, PriorityQueueTag>
|
||||
::value));
|
||||
typedef boost::reference_wrapper<int> int_refw;
|
||||
typedef typename boost::parameter::value_type<
|
||||
ArgPack,
|
||||
PriorityQueueTag,
|
||||
int_refw
|
||||
>::type
|
||||
param_value_type_wrapper;
|
||||
typedef typename param_value_type_wrapper::type
|
||||
param_value_type;
|
||||
typedef typename boost::remove_const<param_value_type>::type param_value_type_no_const;
|
||||
typedef priority_queue_maker_helper<g_hasQ, Graph, ArgPack, KeyT, ValueT, KeyMapTag, IndexInHeapMapTag, Compare,
|
||||
param_value_type_no_const> helper;
|
||||
typedef typename helper::priority_queue_type priority_queue_type;
|
||||
|
||||
static priority_queue_type make_queue(const Graph& g, const ArgPack& ap, KeyT defaultKey) {
|
||||
return helper::make_queue(g, ap, defaultKey, ap[::boost::parameter::keyword<PriorityQueueTag>::instance | 0]);
|
||||
}
|
||||
};
|
||||
|
||||
template <class PriorityQueueTag, class KeyT, class ValueT, class Compare = std::less<KeyT>, class KeyMapTag = boost::graph::keywords::tag::distance_map, class IndexInHeapMapTag = boost::graph::keywords::tag::index_in_heap_map>
|
||||
struct make_priority_queue_from_arg_pack_gen {
|
||||
KeyT defaultKey;
|
||||
|
||||
make_priority_queue_from_arg_pack_gen(KeyT defaultKey_) : defaultKey(defaultKey_) { }
|
||||
|
||||
template <class F>
|
||||
struct result {
|
||||
typedef typename remove_const<typename remove_reference<typename function_traits<F>::arg1_type>::type>::type graph_type;
|
||||
typedef typename remove_const<typename remove_reference<typename function_traits<F>::arg2_type>::type>::type arg_pack_type;
|
||||
typedef typename priority_queue_maker<graph_type, arg_pack_type, KeyT, ValueT, PriorityQueueTag, KeyMapTag, IndexInHeapMapTag, Compare>::priority_queue_type type;
|
||||
};
|
||||
|
||||
template <class Graph, class ArgPack>
|
||||
typename priority_queue_maker<Graph, ArgPack, KeyT, ValueT, PriorityQueueTag, KeyMapTag, IndexInHeapMapTag, Compare>::priority_queue_type
|
||||
operator()(const Graph& g, const ArgPack& ap) const {
|
||||
return priority_queue_maker<Graph, ArgPack, KeyT, ValueT, PriorityQueueTag, KeyMapTag, IndexInHeapMapTag, Compare>::make_queue(g, ap, defaultKey);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename G>
|
||||
typename boost::graph_traits<G>::vertex_descriptor
|
||||
get_null_vertex(const G&) {return boost::graph_traits<G>::null_vertex();}
|
||||
|
||||
template <typename G>
|
||||
typename boost::graph_traits<G>::vertex_descriptor
|
||||
get_default_starting_vertex(const G& g) {
|
||||
std::pair<typename boost::graph_traits<G>::vertex_iterator, typename boost::graph_traits<G>::vertex_iterator> iters = vertices(g);
|
||||
return (iters.first == iters.second) ? boost::graph_traits<G>::null_vertex() : *iters.first;
|
||||
}
|
||||
|
||||
template <typename G>
|
||||
struct get_default_starting_vertex_t {
|
||||
typedef typename boost::graph_traits<G>::vertex_descriptor result_type;
|
||||
const G& g;
|
||||
get_default_starting_vertex_t(const G& g): g(g) {}
|
||||
result_type operator()() const {return get_default_starting_vertex(g);}
|
||||
};
|
||||
|
||||
// Wrapper to avoid instantiating numeric_limits when users provide distance_inf value manually
|
||||
template <typename T>
|
||||
struct get_max {
|
||||
T operator()() const {
|
||||
return (std::numeric_limits<T>::max)();
|
||||
}
|
||||
typedef T result_type;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#undef BOOST_BGL_DECLARE_NAMED_PARAMS
|
||||
|
||||
#endif // BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
|
||||
@@ -0,0 +1,301 @@
|
||||
//---------------------------------------------------------------------------//
|
||||
// Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
|
||||
//
|
||||
// Distributed under 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
|
||||
//
|
||||
// See http://boostorg.github.com/compute for more information.
|
||||
//---------------------------------------------------------------------------//
|
||||
|
||||
#ifndef BOOST_COMPUTE_ALGORITHM_REDUCE_HPP
|
||||
#define BOOST_COMPUTE_ALGORITHM_REDUCE_HPP
|
||||
|
||||
#include <iterator>
|
||||
|
||||
#include <boost/compute/system.hpp>
|
||||
#include <boost/compute/functional.hpp>
|
||||
#include <boost/compute/detail/meta_kernel.hpp>
|
||||
#include <boost/compute/command_queue.hpp>
|
||||
#include <boost/compute/container/array.hpp>
|
||||
#include <boost/compute/container/vector.hpp>
|
||||
#include <boost/compute/algorithm/copy_n.hpp>
|
||||
#include <boost/compute/algorithm/detail/inplace_reduce.hpp>
|
||||
#include <boost/compute/algorithm/detail/reduce_on_gpu.hpp>
|
||||
#include <boost/compute/algorithm/detail/reduce_on_cpu.hpp>
|
||||
#include <boost/compute/detail/iterator_range_size.hpp>
|
||||
#include <boost/compute/memory/local_buffer.hpp>
|
||||
#include <boost/compute/type_traits/result_of.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace compute {
|
||||
namespace detail {
|
||||
|
||||
template<class InputIterator, class OutputIterator, class BinaryFunction>
|
||||
size_t reduce(InputIterator first,
|
||||
size_t count,
|
||||
OutputIterator result,
|
||||
size_t block_size,
|
||||
BinaryFunction function,
|
||||
command_queue &queue)
|
||||
{
|
||||
typedef typename
|
||||
std::iterator_traits<InputIterator>::value_type
|
||||
input_type;
|
||||
typedef typename
|
||||
boost::compute::result_of<BinaryFunction(input_type, input_type)>::type
|
||||
result_type;
|
||||
|
||||
const context &context = queue.get_context();
|
||||
size_t block_count = count / 2 / block_size;
|
||||
size_t total_block_count =
|
||||
static_cast<size_t>(std::ceil(float(count) / 2.f / float(block_size)));
|
||||
|
||||
if(block_count != 0){
|
||||
meta_kernel k("block_reduce");
|
||||
size_t output_arg = k.add_arg<result_type *>(memory_object::global_memory, "output");
|
||||
size_t block_arg = k.add_arg<input_type *>(memory_object::local_memory, "block");
|
||||
|
||||
k <<
|
||||
"const uint gid = get_global_id(0);\n" <<
|
||||
"const uint lid = get_local_id(0);\n" <<
|
||||
|
||||
// copy values to local memory
|
||||
"block[lid] = " <<
|
||||
function(first[k.make_var<uint_>("gid*2+0")],
|
||||
first[k.make_var<uint_>("gid*2+1")]) << ";\n" <<
|
||||
|
||||
// perform reduction
|
||||
"for(uint i = 1; i < " << uint_(block_size) << "; i <<= 1){\n" <<
|
||||
" barrier(CLK_LOCAL_MEM_FENCE);\n" <<
|
||||
" uint mask = (i << 1) - 1;\n" <<
|
||||
" if((lid & mask) == 0){\n" <<
|
||||
" block[lid] = " <<
|
||||
function(k.expr<input_type>("block[lid]"),
|
||||
k.expr<input_type>("block[lid+i]")) << ";\n" <<
|
||||
" }\n" <<
|
||||
"}\n" <<
|
||||
|
||||
// write block result to global output
|
||||
"if(lid == 0)\n" <<
|
||||
" output[get_group_id(0)] = block[0];\n";
|
||||
|
||||
kernel kernel = k.compile(context);
|
||||
kernel.set_arg(output_arg, result.get_buffer());
|
||||
kernel.set_arg(block_arg, local_buffer<input_type>(block_size));
|
||||
|
||||
queue.enqueue_1d_range_kernel(kernel,
|
||||
0,
|
||||
block_count * block_size,
|
||||
block_size);
|
||||
}
|
||||
|
||||
// serially reduce any leftovers
|
||||
if(block_count * block_size * 2 < count){
|
||||
size_t last_block_start = block_count * block_size * 2;
|
||||
|
||||
meta_kernel k("extra_serial_reduce");
|
||||
size_t count_arg = k.add_arg<uint_>("count");
|
||||
size_t offset_arg = k.add_arg<uint_>("offset");
|
||||
size_t output_arg = k.add_arg<result_type *>(memory_object::global_memory, "output");
|
||||
size_t output_offset_arg = k.add_arg<uint_>("output_offset");
|
||||
|
||||
k <<
|
||||
k.decl<result_type>("result") << " = \n" <<
|
||||
first[k.expr<uint_>("offset")] << ";\n" <<
|
||||
"for(uint i = offset + 1; i < count; i++)\n" <<
|
||||
" result = " <<
|
||||
function(k.var<result_type>("result"),
|
||||
first[k.var<uint_>("i")]) << ";\n" <<
|
||||
"output[output_offset] = result;\n";
|
||||
|
||||
kernel kernel = k.compile(context);
|
||||
kernel.set_arg(count_arg, static_cast<uint_>(count));
|
||||
kernel.set_arg(offset_arg, static_cast<uint_>(last_block_start));
|
||||
kernel.set_arg(output_arg, result.get_buffer());
|
||||
kernel.set_arg(output_offset_arg, static_cast<uint_>(block_count));
|
||||
|
||||
queue.enqueue_task(kernel);
|
||||
}
|
||||
|
||||
return total_block_count;
|
||||
}
|
||||
|
||||
template<class InputIterator, class BinaryFunction>
|
||||
inline vector<
|
||||
typename boost::compute::result_of<
|
||||
BinaryFunction(
|
||||
typename std::iterator_traits<InputIterator>::value_type,
|
||||
typename std::iterator_traits<InputIterator>::value_type
|
||||
)
|
||||
>::type
|
||||
>
|
||||
block_reduce(InputIterator first,
|
||||
size_t count,
|
||||
size_t block_size,
|
||||
BinaryFunction function,
|
||||
command_queue &queue)
|
||||
{
|
||||
typedef typename
|
||||
std::iterator_traits<InputIterator>::value_type
|
||||
input_type;
|
||||
typedef typename
|
||||
boost::compute::result_of<BinaryFunction(input_type, input_type)>::type
|
||||
result_type;
|
||||
|
||||
const context &context = queue.get_context();
|
||||
size_t total_block_count =
|
||||
static_cast<size_t>(std::ceil(float(count) / 2.f / float(block_size)));
|
||||
vector<result_type> result_vector(total_block_count, context);
|
||||
|
||||
reduce(first, count, result_vector.begin(), block_size, function, queue);
|
||||
|
||||
return result_vector;
|
||||
}
|
||||
|
||||
template<class InputIterator, class OutputIterator, class BinaryFunction>
|
||||
inline void generic_reduce(InputIterator first,
|
||||
InputIterator last,
|
||||
OutputIterator result,
|
||||
BinaryFunction function,
|
||||
command_queue &queue)
|
||||
{
|
||||
typedef typename
|
||||
std::iterator_traits<InputIterator>::value_type
|
||||
input_type;
|
||||
typedef typename
|
||||
boost::compute::result_of<BinaryFunction(input_type, input_type)>::type
|
||||
result_type;
|
||||
|
||||
const device &device = queue.get_device();
|
||||
const context &context = queue.get_context();
|
||||
|
||||
size_t count = detail::iterator_range_size(first, last);
|
||||
|
||||
if(device.type() & device::cpu){
|
||||
array<result_type, 1> value(context);
|
||||
detail::reduce_on_cpu(first, last, value.begin(), function, queue);
|
||||
boost::compute::copy_n(value.begin(), 1, result, queue);
|
||||
}
|
||||
else {
|
||||
size_t block_size = 256;
|
||||
|
||||
// first pass
|
||||
vector<result_type> results = detail::block_reduce(first,
|
||||
count,
|
||||
block_size,
|
||||
function,
|
||||
queue);
|
||||
|
||||
if(results.size() > 1){
|
||||
detail::inplace_reduce(results.begin(),
|
||||
results.end(),
|
||||
function,
|
||||
queue);
|
||||
}
|
||||
|
||||
boost::compute::copy_n(results.begin(), 1, result, queue);
|
||||
}
|
||||
}
|
||||
|
||||
template<class InputIterator, class OutputIterator, class T>
|
||||
inline void dispatch_reduce(InputIterator first,
|
||||
InputIterator last,
|
||||
OutputIterator result,
|
||||
const plus<T> &function,
|
||||
command_queue &queue)
|
||||
{
|
||||
const context &context = queue.get_context();
|
||||
const device &device = queue.get_device();
|
||||
|
||||
// reduce to temporary buffer on device
|
||||
array<T, 1> value(context);
|
||||
if(device.type() & device::cpu){
|
||||
detail::reduce_on_cpu(first, last, value.begin(), function, queue);
|
||||
}
|
||||
else {
|
||||
reduce_on_gpu(first, last, value.begin(), function, queue);
|
||||
}
|
||||
|
||||
// copy to result iterator
|
||||
copy_n(value.begin(), 1, result, queue);
|
||||
}
|
||||
|
||||
template<class InputIterator, class OutputIterator, class BinaryFunction>
|
||||
inline void dispatch_reduce(InputIterator first,
|
||||
InputIterator last,
|
||||
OutputIterator result,
|
||||
BinaryFunction function,
|
||||
command_queue &queue)
|
||||
{
|
||||
generic_reduce(first, last, result, function, queue);
|
||||
}
|
||||
|
||||
} // end detail namespace
|
||||
|
||||
/// Returns the result of applying \p function to the elements in the
|
||||
/// range [\p first, \p last).
|
||||
///
|
||||
/// If no function is specified, \c plus will be used.
|
||||
///
|
||||
/// \param first first element in the input range
|
||||
/// \param last last element in the input range
|
||||
/// \param result iterator pointing to the output
|
||||
/// \param function binary reduction function
|
||||
/// \param queue command queue to perform the operation
|
||||
///
|
||||
/// The \c reduce() algorithm assumes that the binary reduction function is
|
||||
/// associative. When used with non-associative functions the result may
|
||||
/// be non-deterministic and vary in precision. Notably this affects the
|
||||
/// \c plus<float>() function as floating-point addition is not associative
|
||||
/// and may produce slightly different results than a serial algorithm.
|
||||
///
|
||||
/// This algorithm supports both host and device iterators for the
|
||||
/// result argument. This allows for values to be reduced and copied
|
||||
/// to the host all with a single function call.
|
||||
///
|
||||
/// For example, to calculate the sum of the values in a device vector and
|
||||
/// copy the result to a value on the host:
|
||||
///
|
||||
/// \snippet test/test_reduce.cpp sum_int
|
||||
///
|
||||
/// Note that while the the \c reduce() algorithm is conceptually identical to
|
||||
/// the \c accumulate() algorithm, its implementation is substantially more
|
||||
/// efficient on parallel hardware. For more information, see the documentation
|
||||
/// on the \c accumulate() algorithm.
|
||||
///
|
||||
/// \see accumulate()
|
||||
template<class InputIterator, class OutputIterator, class BinaryFunction>
|
||||
inline void reduce(InputIterator first,
|
||||
InputIterator last,
|
||||
OutputIterator result,
|
||||
BinaryFunction function,
|
||||
command_queue &queue = system::default_queue())
|
||||
{
|
||||
if(first == last){
|
||||
return;
|
||||
}
|
||||
|
||||
detail::dispatch_reduce(first, last, result, function, queue);
|
||||
}
|
||||
|
||||
/// \overload
|
||||
template<class InputIterator, class OutputIterator>
|
||||
inline void reduce(InputIterator first,
|
||||
InputIterator last,
|
||||
OutputIterator result,
|
||||
command_queue &queue = system::default_queue())
|
||||
{
|
||||
typedef typename std::iterator_traits<InputIterator>::value_type T;
|
||||
|
||||
if(first == last){
|
||||
return;
|
||||
}
|
||||
|
||||
detail::dispatch_reduce(first, last, result, plus<T>(), queue);
|
||||
}
|
||||
|
||||
} // end compute namespace
|
||||
} // end boost namespace
|
||||
|
||||
#endif // BOOST_COMPUTE_ALGORITHM_REDUCE_HPP
|
||||
@@ -0,0 +1,88 @@
|
||||
//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
|
||||
|
||||
//Distributed under 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)
|
||||
|
||||
#ifndef UUID_7E48761AD92811DC9011477D56D89593
|
||||
#define UUID_7E48761AD92811DC9011477D56D89593
|
||||
#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
|
||||
#pragma warning(push,1)
|
||||
#endif
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/exception/detail/is_output_streamable.hpp>
|
||||
#include <sstream>
|
||||
|
||||
namespace
|
||||
boost
|
||||
{
|
||||
template <class T,class U>
|
||||
std::string to_string( std::pair<T,U> const & );
|
||||
std::string to_string( std::exception const & );
|
||||
|
||||
namespace
|
||||
to_string_detail
|
||||
{
|
||||
template <class T>
|
||||
typename disable_if<is_output_streamable<T>,char>::type to_string( T const & );
|
||||
using boost::to_string;
|
||||
|
||||
template <class,bool IsOutputStreamable>
|
||||
struct has_to_string_impl;
|
||||
|
||||
template <class T>
|
||||
struct
|
||||
has_to_string_impl<T,true>
|
||||
{
|
||||
enum e { value=1 };
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct
|
||||
has_to_string_impl<T,false>
|
||||
{
|
||||
static T const & f();
|
||||
enum e { value=1!=sizeof(to_string(f())) };
|
||||
};
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline
|
||||
typename enable_if<is_output_streamable<T>,std::string>::type
|
||||
to_string( T const & x )
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << x;
|
||||
return out.str();
|
||||
}
|
||||
|
||||
template <class T>
|
||||
struct
|
||||
has_to_string
|
||||
{
|
||||
enum e { value=to_string_detail::has_to_string_impl<T,is_output_streamable<T>::value>::value };
|
||||
};
|
||||
|
||||
template <class T,class U>
|
||||
inline
|
||||
std::string
|
||||
to_string( std::pair<T,U> const & x )
|
||||
{
|
||||
return std::string("(") + to_string(x.first) + ',' + to_string(x.second) + ')';
|
||||
}
|
||||
|
||||
inline
|
||||
std::string
|
||||
to_string( std::exception const & x )
|
||||
{
|
||||
return x.what();
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,692 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under 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)
|
||||
|
||||
This is an auto-generated file. Do not edit!
|
||||
==============================================================================*/
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
struct void_;
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 = void_ , typename K1 = void_ , typename K2 = void_ , typename K3 = void_ , typename K4 = void_ , typename K5 = void_ , typename K6 = void_ , typename K7 = void_ , typename K8 = void_ , typename K9 = void_ , typename K10 = void_ , typename K11 = void_ , typename K12 = void_ , typename K13 = void_ , typename K14 = void_ , typename K15 = void_ , typename K16 = void_ , typename K17 = void_ , typename K18 = void_ , typename K19 = void_ , typename K20 = void_ , typename K21 = void_ , typename K22 = void_ , typename K23 = void_ , typename K24 = void_ , typename K25 = void_ , typename K26 = void_ , typename K27 = void_ , typename K28 = void_ , typename K29 = void_
|
||||
, typename D0 = void_ , typename D1 = void_ , typename D2 = void_ , typename D3 = void_ , typename D4 = void_ , typename D5 = void_ , typename D6 = void_ , typename D7 = void_ , typename D8 = void_ , typename D9 = void_ , typename D10 = void_ , typename D11 = void_ , typename D12 = void_ , typename D13 = void_ , typename D14 = void_ , typename D15 = void_ , typename D16 = void_ , typename D17 = void_ , typename D18 = void_ , typename D19 = void_ , typename D20 = void_ , typename D21 = void_ , typename D22 = void_ , typename D23 = void_ , typename D24 = void_ , typename D25 = void_ , typename D26 = void_ , typename D27 = void_ , typename D28 = void_ , typename D29 = void_
|
||||
, typename Extra = void_
|
||||
>
|
||||
struct make_map;
|
||||
template <>
|
||||
struct make_map<>
|
||||
{
|
||||
typedef map<> type;
|
||||
};
|
||||
}
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<>
|
||||
make_map()
|
||||
{
|
||||
return map<>();
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0
|
||||
, typename D0
|
||||
>
|
||||
struct make_map<K0, D0 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0
|
||||
, typename D0
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> >
|
||||
make_map(D0 const& arg0)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> >(
|
||||
fusion::make_pair<K0>(arg0));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1
|
||||
, typename D0 , typename D1
|
||||
>
|
||||
struct make_map<K0 , K1, D0 , D1 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1
|
||||
, typename D0 , typename D1
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2
|
||||
, typename D0 , typename D1 , typename D2
|
||||
>
|
||||
struct make_map<K0 , K1 , K2, D0 , D1 , D2 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2
|
||||
, typename D0 , typename D1 , typename D2
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3
|
||||
, typename D0 , typename D1 , typename D2 , typename D3
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3, D0 , D1 , D2 , D3 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3
|
||||
, typename D0 , typename D1 , typename D2 , typename D3
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4, D0 , D1 , D2 , D3 , D4 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5, D0 , D1 , D2 , D3 , D4 , D5 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6, D0 , D1 , D2 , D3 , D4 , D5 , D6 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , D23 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22 , D23 const& arg23)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22) , fusion::make_pair<K23>(arg23));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23 , K24, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , D23 , D24 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22 , D23 const& arg23 , D24 const& arg24)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22) , fusion::make_pair<K23>(arg23) , fusion::make_pair<K24>(arg24));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23 , K24 , K25, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , D23 , D24 , D25 , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22 , D23 const& arg23 , D24 const& arg24 , D25 const& arg25)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22) , fusion::make_pair<K23>(arg23) , fusion::make_pair<K24>(arg24) , fusion::make_pair<K25>(arg25));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23 , K24 , K25 , K26, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , D23 , D24 , D25 , D26 , void_ , void_ , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22 , D23 const& arg23 , D24 const& arg24 , D25 const& arg25 , D26 const& arg26)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22) , fusion::make_pair<K23>(arg23) , fusion::make_pair<K24>(arg24) , fusion::make_pair<K25>(arg25) , fusion::make_pair<K26>(arg26));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26 , typename K27
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26 , typename D27
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , D23 , D24 , D25 , D26 , D27 , void_ , void_ , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26 , typename K27
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26 , typename D27
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22 , D23 const& arg23 , D24 const& arg24 , D25 const& arg25 , D26 const& arg26 , D27 const& arg27)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22) , fusion::make_pair<K23>(arg23) , fusion::make_pair<K24>(arg24) , fusion::make_pair<K25>(arg25) , fusion::make_pair<K26>(arg26) , fusion::make_pair<K27>(arg27));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26 , typename K27 , typename K28
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26 , typename D27 , typename D28
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 , K28, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , D23 , D24 , D25 , D26 , D27 , D28 , void_ , void_ , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> , fusion::pair< K28 , typename detail::as_fusion_element<D28>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26 , typename K27 , typename K28
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26 , typename D27 , typename D28
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> , fusion::pair< K28 , typename detail::as_fusion_element<D28>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22 , D23 const& arg23 , D24 const& arg24 , D25 const& arg25 , D26 const& arg26 , D27 const& arg27 , D28 const& arg28)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> , fusion::pair< K28 , typename detail::as_fusion_element<D28>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22) , fusion::make_pair<K23>(arg23) , fusion::make_pair<K24>(arg24) , fusion::make_pair<K25>(arg25) , fusion::make_pair<K26>(arg26) , fusion::make_pair<K27>(arg27) , fusion::make_pair<K28>(arg28));
|
||||
}
|
||||
namespace result_of
|
||||
{
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26 , typename K27 , typename K28 , typename K29
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26 , typename D27 , typename D28 , typename D29
|
||||
>
|
||||
struct make_map<K0 , K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 , K18 , K19 , K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 , K28 , K29, D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 , D8 , D9 , D10 , D11 , D12 , D13 , D14 , D15 , D16 , D17 , D18 , D19 , D20 , D21 , D22 , D23 , D24 , D25 , D26 , D27 , D28 , D29 , void_>
|
||||
{
|
||||
typedef map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> , fusion::pair< K28 , typename detail::as_fusion_element<D28>::type> , fusion::pair< K29 , typename detail::as_fusion_element<D29>::type> > type;
|
||||
};
|
||||
}
|
||||
template <
|
||||
typename K0 , typename K1 , typename K2 , typename K3 , typename K4 , typename K5 , typename K6 , typename K7 , typename K8 , typename K9 , typename K10 , typename K11 , typename K12 , typename K13 , typename K14 , typename K15 , typename K16 , typename K17 , typename K18 , typename K19 , typename K20 , typename K21 , typename K22 , typename K23 , typename K24 , typename K25 , typename K26 , typename K27 , typename K28 , typename K29
|
||||
, typename D0 , typename D1 , typename D2 , typename D3 , typename D4 , typename D5 , typename D6 , typename D7 , typename D8 , typename D9 , typename D10 , typename D11 , typename D12 , typename D13 , typename D14 , typename D15 , typename D16 , typename D17 , typename D18 , typename D19 , typename D20 , typename D21 , typename D22 , typename D23 , typename D24 , typename D25 , typename D26 , typename D27 , typename D28 , typename D29
|
||||
>
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
inline map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> , fusion::pair< K28 , typename detail::as_fusion_element<D28>::type> , fusion::pair< K29 , typename detail::as_fusion_element<D29>::type> >
|
||||
make_map(D0 const& arg0 , D1 const& arg1 , D2 const& arg2 , D3 const& arg3 , D4 const& arg4 , D5 const& arg5 , D6 const& arg6 , D7 const& arg7 , D8 const& arg8 , D9 const& arg9 , D10 const& arg10 , D11 const& arg11 , D12 const& arg12 , D13 const& arg13 , D14 const& arg14 , D15 const& arg15 , D16 const& arg16 , D17 const& arg17 , D18 const& arg18 , D19 const& arg19 , D20 const& arg20 , D21 const& arg21 , D22 const& arg22 , D23 const& arg23 , D24 const& arg24 , D25 const& arg25 , D26 const& arg26 , D27 const& arg27 , D28 const& arg28 , D29 const& arg29)
|
||||
{
|
||||
return map<fusion::pair< K0 , typename detail::as_fusion_element<D0>::type> , fusion::pair< K1 , typename detail::as_fusion_element<D1>::type> , fusion::pair< K2 , typename detail::as_fusion_element<D2>::type> , fusion::pair< K3 , typename detail::as_fusion_element<D3>::type> , fusion::pair< K4 , typename detail::as_fusion_element<D4>::type> , fusion::pair< K5 , typename detail::as_fusion_element<D5>::type> , fusion::pair< K6 , typename detail::as_fusion_element<D6>::type> , fusion::pair< K7 , typename detail::as_fusion_element<D7>::type> , fusion::pair< K8 , typename detail::as_fusion_element<D8>::type> , fusion::pair< K9 , typename detail::as_fusion_element<D9>::type> , fusion::pair< K10 , typename detail::as_fusion_element<D10>::type> , fusion::pair< K11 , typename detail::as_fusion_element<D11>::type> , fusion::pair< K12 , typename detail::as_fusion_element<D12>::type> , fusion::pair< K13 , typename detail::as_fusion_element<D13>::type> , fusion::pair< K14 , typename detail::as_fusion_element<D14>::type> , fusion::pair< K15 , typename detail::as_fusion_element<D15>::type> , fusion::pair< K16 , typename detail::as_fusion_element<D16>::type> , fusion::pair< K17 , typename detail::as_fusion_element<D17>::type> , fusion::pair< K18 , typename detail::as_fusion_element<D18>::type> , fusion::pair< K19 , typename detail::as_fusion_element<D19>::type> , fusion::pair< K20 , typename detail::as_fusion_element<D20>::type> , fusion::pair< K21 , typename detail::as_fusion_element<D21>::type> , fusion::pair< K22 , typename detail::as_fusion_element<D22>::type> , fusion::pair< K23 , typename detail::as_fusion_element<D23>::type> , fusion::pair< K24 , typename detail::as_fusion_element<D24>::type> , fusion::pair< K25 , typename detail::as_fusion_element<D25>::type> , fusion::pair< K26 , typename detail::as_fusion_element<D26>::type> , fusion::pair< K27 , typename detail::as_fusion_element<D27>::type> , fusion::pair< K28 , typename detail::as_fusion_element<D28>::type> , fusion::pair< K29 , typename detail::as_fusion_element<D29>::type> >(
|
||||
fusion::make_pair<K0>(arg0) , fusion::make_pair<K1>(arg1) , fusion::make_pair<K2>(arg2) , fusion::make_pair<K3>(arg3) , fusion::make_pair<K4>(arg4) , fusion::make_pair<K5>(arg5) , fusion::make_pair<K6>(arg6) , fusion::make_pair<K7>(arg7) , fusion::make_pair<K8>(arg8) , fusion::make_pair<K9>(arg9) , fusion::make_pair<K10>(arg10) , fusion::make_pair<K11>(arg11) , fusion::make_pair<K12>(arg12) , fusion::make_pair<K13>(arg13) , fusion::make_pair<K14>(arg14) , fusion::make_pair<K15>(arg15) , fusion::make_pair<K16>(arg16) , fusion::make_pair<K17>(arg17) , fusion::make_pair<K18>(arg18) , fusion::make_pair<K19>(arg19) , fusion::make_pair<K20>(arg20) , fusion::make_pair<K21>(arg21) , fusion::make_pair<K22>(arg22) , fusion::make_pair<K23>(arg23) , fusion::make_pair<K24>(arg24) , fusion::make_pair<K25>(arg25) , fusion::make_pair<K26>(arg26) , fusion::make_pair<K27>(arg27) , fusion::make_pair<K28>(arg28) , fusion::make_pair<K29>(arg29));
|
||||
}
|
||||
}}
|
||||
@@ -0,0 +1,78 @@
|
||||
// Copyright (c) 2007 John Maddock
|
||||
// Use, modification and distribution are 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)
|
||||
|
||||
#ifndef BOOST_MATH_SIN_PI_HPP
|
||||
#define BOOST_MATH_SIN_PI_HPP
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <boost/config/no_tr1/cmath.hpp>
|
||||
#include <boost/math/tools/config.hpp>
|
||||
#include <boost/math/special_functions/math_fwd.hpp>
|
||||
#include <boost/math/special_functions/trunc.hpp>
|
||||
#include <boost/math/tools/promotion.hpp>
|
||||
#include <boost/math/constants/constants.hpp>
|
||||
|
||||
namespace boost{ namespace math{ namespace detail{
|
||||
|
||||
template <class T, class Policy>
|
||||
T sin_pi_imp(T x, const Policy& pol)
|
||||
{
|
||||
BOOST_MATH_STD_USING // ADL of std names
|
||||
if(x < 0)
|
||||
return -sin_pi(-x);
|
||||
// sin of pi*x:
|
||||
bool invert;
|
||||
if(x < 0.5)
|
||||
return sin(constants::pi<T>() * x);
|
||||
if(x < 1)
|
||||
{
|
||||
invert = true;
|
||||
x = -x;
|
||||
}
|
||||
else
|
||||
invert = false;
|
||||
|
||||
T rem = floor(x);
|
||||
if(itrunc(rem, pol) & 1)
|
||||
invert = !invert;
|
||||
rem = x - rem;
|
||||
if(rem > 0.5f)
|
||||
rem = 1 - rem;
|
||||
if(rem == 0.5f)
|
||||
return static_cast<T>(invert ? -1 : 1);
|
||||
|
||||
rem = sin(constants::pi<T>() * rem);
|
||||
return invert ? T(-rem) : rem;
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <class T, class Policy>
|
||||
inline typename tools::promote_args<T>::type sin_pi(T x, const Policy&)
|
||||
{
|
||||
typedef typename tools::promote_args<T>::type result_type;
|
||||
typedef typename policies::evaluation<result_type, Policy>::type value_type;
|
||||
typedef typename policies::normalise<
|
||||
Policy,
|
||||
policies::promote_float<false>,
|
||||
policies::promote_double<false>,
|
||||
policies::discrete_quantile<>,
|
||||
policies::assert_undefined<> >::type forwarding_policy;
|
||||
return policies::checked_narrowing_cast<result_type, forwarding_policy>(boost::math::detail::sin_pi_imp<value_type>(x, forwarding_policy()), "cos_pi");
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline typename tools::promote_args<T>::type sin_pi(T x)
|
||||
{
|
||||
return boost::math::sin_pi(x, policies::policy<>());
|
||||
}
|
||||
|
||||
} // namespace math
|
||||
} // namespace boost
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
|
||||
#ifndef BOOST_MPL_BASE_HPP_INCLUDED
|
||||
#define BOOST_MPL_BASE_HPP_INCLUDED
|
||||
|
||||
// Copyright Aleksey Gurtovoy 2000-2004
|
||||
//
|
||||
// Distributed under 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)
|
||||
//
|
||||
// See http://www.boost.org/libs/mpl for documentation.
|
||||
|
||||
// $Id$
|
||||
// $Date$
|
||||
// $Revision$
|
||||
|
||||
#include <boost/mpl/aux_/na_spec.hpp>
|
||||
#include <boost/mpl/aux_/lambda_support.hpp>
|
||||
|
||||
namespace boost { namespace mpl {
|
||||
|
||||
template<
|
||||
typename BOOST_MPL_AUX_NA_PARAM(T)
|
||||
>
|
||||
struct base
|
||||
{
|
||||
typedef typename T::base type;
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,base,(T))
|
||||
};
|
||||
|
||||
BOOST_MPL_AUX_NA_SPEC(1, base)
|
||||
|
||||
}}
|
||||
|
||||
#endif // BOOST_MPL_BASE_HPP_INCLUDED
|
||||
@@ -0,0 +1,102 @@
|
||||
/*==============================================================================
|
||||
Copyright (c) 2005-2010 Joel de Guzman
|
||||
Copyright (c) 2010 Thomas Heller
|
||||
Copyright (c) 2015 John Fletcher
|
||||
|
||||
Distributed under 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)
|
||||
==============================================================================*/
|
||||
#ifndef BOOST_PHOENIX_FUNCTION_ADAPT_FUNCTION_HPP
|
||||
#define BOOST_PHOENIX_FUNCTION_ADAPT_FUNCTION_HPP
|
||||
|
||||
#include <boost/phoenix/core/limits.hpp>
|
||||
#include <boost/phoenix/core/detail/function_eval.hpp>
|
||||
#include <boost/preprocessor/repetition/repeat.hpp>
|
||||
|
||||
#define BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(RESULT, NAME, FUNC) \
|
||||
namespace detail0 \
|
||||
{ \
|
||||
struct BOOST_PP_CAT(NAME, _impl_nullary) \
|
||||
{ \
|
||||
typedef RESULT result_type; \
|
||||
\
|
||||
result_type \
|
||||
operator()() const \
|
||||
{ \
|
||||
return FUNC(); \
|
||||
} \
|
||||
}; \
|
||||
} \
|
||||
\
|
||||
inline \
|
||||
boost::phoenix::detail::expression::function_eval< \
|
||||
detail0:: BOOST_PP_CAT(NAME, _impl_nullary) \
|
||||
>::type const \
|
||||
NAME() \
|
||||
{ \
|
||||
return boost::phoenix::detail::expression:: \
|
||||
function_eval<detail0:: BOOST_PP_CAT(NAME, _impl_nullary)> \
|
||||
::make(detail0:: BOOST_PP_CAT(NAME, _impl_nullary)()); \
|
||||
} \
|
||||
/**/
|
||||
|
||||
#define BOOST_PHOENIX_ADAPT_FUNCTION(RESULT, NAME, FUNC, N) \
|
||||
namespace detail1 \
|
||||
{ \
|
||||
struct BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
|
||||
{ \
|
||||
template <typename Sig> \
|
||||
struct result; \
|
||||
\
|
||||
template <typename This, BOOST_PHOENIX_typename_A(N)> \
|
||||
struct result<This(BOOST_PHOENIX_A(N))> \
|
||||
{typedef RESULT type;}; \
|
||||
\
|
||||
template <BOOST_PHOENIX_typename_A(N)> \
|
||||
RESULT \
|
||||
operator()(BOOST_PHOENIX_A_ref_a(N)) const \
|
||||
{ \
|
||||
return FUNC(BOOST_PHOENIX_a(N)); \
|
||||
} \
|
||||
}; \
|
||||
} \
|
||||
\
|
||||
template <BOOST_PHOENIX_typename_A(N)> \
|
||||
inline \
|
||||
typename \
|
||||
boost::phoenix::detail::expression::function_eval< \
|
||||
detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
|
||||
, BOOST_PHOENIX_A(N)>::type const \
|
||||
NAME(BOOST_PHOENIX_A_const_ref_a(N)) \
|
||||
{ \
|
||||
return boost::phoenix::detail::expression:: \
|
||||
function_eval< \
|
||||
detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N) \
|
||||
, BOOST_PHOENIX_A(N) \
|
||||
>::make( \
|
||||
detail1:: BOOST_PP_CAT(BOOST_PP_CAT(NAME, _impl_), N)() \
|
||||
, BOOST_PHOENIX_a(N) \
|
||||
); \
|
||||
} \
|
||||
/**/
|
||||
|
||||
#define BOOST_PHOENIX_ADAPT_FUNCTION_VARARG(RESULT, NAME, FUNC) \
|
||||
BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(NAME, FUNC) \
|
||||
BOOST_PP_REPEAT_FROM_TO( \
|
||||
1 \
|
||||
, BOOST_PHOENIX_LIMIT \
|
||||
, BOOST_PHOENIX_ADAPT_FUNCTION_VARARG_R \
|
||||
, (RESULT, NAME, FUNC) \
|
||||
) \
|
||||
/**/
|
||||
|
||||
#define BOOST_PHOENIX_ADAPT_FUNCTION_VARARG_R(Z, N, D) \
|
||||
BOOST_PHOENIX_ADAPT_FUNCTION( \
|
||||
BOOST_PP_TUPLE_ELEM(3, 0, D) \
|
||||
, BOOST_PP_TUPLE_ELEM(3, 1, D) \
|
||||
, BOOST_PP_TUPLE_ELEM(3, 2, D) \
|
||||
, N \
|
||||
) \
|
||||
/**/
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,51 @@
|
||||
128
|
||||
48
|
||||
9
|
||||
1 17 34 51 66 81 99 111 124
|
||||
2 18 35 50 67 82 100 112 125
|
||||
3 19 36 52 68 82 101 111 126
|
||||
2 20 36 51 69 83 102 113 127
|
||||
4 19 37 53 66 84 103 114 128
|
||||
5 21 38 54 70 85 92 114 0
|
||||
6 22 39 55 66 85 96 110 0
|
||||
7 23 32 56 71 86 103 115 0
|
||||
8 20 40 55 72 86 104 116 0
|
||||
9 19 41 57 73 87 105 116 0
|
||||
10 24 36 56 74 88 105 117 125
|
||||
10 17 33 47 75 89 106 118 128
|
||||
11 21 42 51 76 87 107 119 0
|
||||
1 25 40 58 74 84 107 113 0
|
||||
12 22 42 49 77 90 108 118 125
|
||||
13 26 43 59 68 89 104 120 124
|
||||
13 22 44 57 75 91 109 113 0
|
||||
12 23 37 46 78 88 107 112 0
|
||||
3 27 34 60 65 87 109 118 0
|
||||
6 27 45 61 79 89 98 112 0
|
||||
14 28 34 62 72 92 106 112 127
|
||||
8 27 42 59 71 92 110 121 126
|
||||
15 20 46 57 79 93 101 115 124
|
||||
9 29 45 62 74 94 108 121 0
|
||||
8 30 38 63 73 95 109 111 128
|
||||
16 29 47 64 69 96 109 117 126
|
||||
16 23 48 63 76 94 110 116 125
|
||||
7 25 39 52 70 97 106 117 124
|
||||
4 26 45 63 67 83 90 119 123
|
||||
15 28 39 50 76 88 103 121 123
|
||||
15 26 33 58 65 97 102 122 0
|
||||
14 31 47 52 77 81 93 116 0
|
||||
14 24 37 61 71 82 99 122 0
|
||||
4 31 40 54 80 91 106 115 122
|
||||
5 32 41 58 77 98 104 117 0
|
||||
9 18 49 65 79 85 104 119 128
|
||||
10 30 43 60 69 84 108 115 123
|
||||
1 18 43 48 73 91 98 114 127
|
||||
3 21 46 64 67 86 108 113 0
|
||||
5 24 48 55 75 93 107 120 126
|
||||
2 32 44 62 80 95 99 114 0
|
||||
16 28 41 59 80 83 100 118 0
|
||||
11 33 35 53 72 96 105 111 0
|
||||
11 25 44 60 78 90 100 120 122
|
||||
6 31 35 56 70 95 102 121 0
|
||||
12 17 50 54 68 94 105 119 0
|
||||
13 29 38 53 78 97 110 123 0
|
||||
7 30 49 61 64 81 101 120 127
|
||||
@@ -0,0 +1,66 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under 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)
|
||||
==============================================================================*/
|
||||
#if !defined(FUSION_DISTANCE_09172005_0730)
|
||||
#define FUSION_DISTANCE_09172005_0730
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/mpl/int.hpp>
|
||||
#include <boost/mpl/if.hpp>
|
||||
#include <boost/mpl/eval_if.hpp>
|
||||
#include <boost/mpl/next.hpp>
|
||||
#include <boost/mpl/identity.hpp>
|
||||
#include <boost/fusion/iterator/next.hpp>
|
||||
#include <boost/fusion/iterator/equal_to.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace distance_detail
|
||||
{
|
||||
// Default distance implementation, linear
|
||||
// search for the Last iterator.
|
||||
|
||||
template <typename First, typename Last>
|
||||
struct linear_distance;
|
||||
|
||||
template <typename First, typename Last>
|
||||
struct next_distance
|
||||
{
|
||||
typedef typename
|
||||
mpl::next<
|
||||
typename linear_distance<
|
||||
typename result_of::next<First>::type
|
||||
, Last
|
||||
>::type
|
||||
>::type
|
||||
type;
|
||||
};
|
||||
|
||||
template <typename First, typename Last>
|
||||
struct linear_distance
|
||||
: mpl::eval_if<
|
||||
result_of::equal_to<First, Last>
|
||||
, mpl::identity<mpl::int_<0> >
|
||||
, next_distance<First, Last>
|
||||
>::type
|
||||
{
|
||||
typedef typename
|
||||
mpl::eval_if<
|
||||
result_of::equal_to<First, Last>
|
||||
, mpl::identity<mpl::int_<0> >
|
||||
, next_distance<First, Last>
|
||||
>::type
|
||||
type;
|
||||
|
||||
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
||||
static type
|
||||
call(First const&, Last const&)
|
||||
{
|
||||
return type();
|
||||
}
|
||||
};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,51 @@
|
||||
// Copyright 2005 Daniel Wallin.
|
||||
// Copyright 2005 Joel de Guzman.
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
// Modeled after range_ex, Copyright 2004 Eric Niebler
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// has_equal_range.hpp
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#ifndef BOOST_PHOENIX_HAS_EQUAL_RANGE_EN_14_12_2004
|
||||
#define BOOST_PHOENIX_HAS_EQUAL_RANGE_EN_14_12_2004
|
||||
|
||||
#include <boost/mpl/or.hpp>
|
||||
#include "./is_std_map.hpp"
|
||||
#include "./is_std_set.hpp"
|
||||
#include "./is_std_hash_map.hpp"
|
||||
#include "./is_std_hash_set.hpp"
|
||||
|
||||
namespace boost
|
||||
{
|
||||
// Specialize this for user-defined types
|
||||
template<typename T>
|
||||
struct has_equal_range
|
||||
: boost::mpl::or_<
|
||||
boost::mpl::or_<
|
||||
is_std_map<T>
|
||||
, is_std_multimap<T>
|
||||
, is_std_set<T>
|
||||
, is_std_multiset<T>
|
||||
>
|
||||
, boost::mpl::or_<
|
||||
is_std_hash_map<T>
|
||||
, is_std_hash_multimap<T>
|
||||
, is_std_hash_set<T>
|
||||
, is_std_hash_multiset<T>
|
||||
>
|
||||
>
|
||||
{
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,158 @@
|
||||
!-------------------------------------------------------------------------------
|
||||
!
|
||||
! This file is part of the WSPR application, Weak Signal Propagation Reporter
|
||||
!
|
||||
! File Name: wsprcode.f90
|
||||
! Description: This program provides examples of the source encoding,
|
||||
! convulsional error-control coding, bit and symbol ordering,
|
||||
! and synchronizing information contained in WSPR messages.
|
||||
!
|
||||
! Copyright (C) 2001-2014 Joseph Taylor, K1JT
|
||||
! License: GPL-3
|
||||
!
|
||||
! This program is free software; you can redistribute it and/or modify it under
|
||||
! the terms of the GNU General Public License as published by the Free Software
|
||||
! Foundation; either version 3 of the License, or (at your option) any later
|
||||
! version.
|
||||
!
|
||||
! This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
! ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
! FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
! details.
|
||||
!
|
||||
! You should have received a copy of the GNU General Public License along with
|
||||
! this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
||||
! Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
!
|
||||
!-------------------------------------------------------------------------------
|
||||
|
||||
program wsprcode
|
||||
|
||||
parameter (NSYM=162)
|
||||
parameter (MAXSYM=176)
|
||||
character*22 msg,msg2
|
||||
integer*1 data0(13)
|
||||
integer*1 data1(13)
|
||||
integer*1 dat(206)
|
||||
integer*1 softsym(206)
|
||||
|
||||
! Define the sync vector:
|
||||
integer*1 sync(NSYM)
|
||||
data sync/ &
|
||||
1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0, &
|
||||
0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1, &
|
||||
0,0,0,0,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,1, &
|
||||
1,0,1,0,0,0,0,1,1,0,1,0,1,0,1,0,1,0,0,1, &
|
||||
0,0,1,0,1,1,0,0,0,1,1,0,1,0,1,0,0,0,1,0, &
|
||||
0,0,0,0,1,0,0,1,0,0,1,1,1,0,1,1,0,0,1,1, &
|
||||
0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,1, &
|
||||
0,0,0,0,0,0,0,1,1,0,1,0,1,1,0,0,0,1,1,0, &
|
||||
0,0/
|
||||
|
||||
! Metric table for decoding from soft symbols
|
||||
integer mettab(0:255,0:1)
|
||||
data mettab/ &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 4, &
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, &
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, &
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 2, &
|
||||
2, 2, 2, 2, 1, 1, 1, 1, 0, 0, &
|
||||
-1, -1, -1, -2, -2, -3, -4, -4, -5, -6, &
|
||||
-7, -7, -8, -9, -10, -11, -12, -12, -13, -14, &
|
||||
-15, -16, -17, -17, -18, -19, -20, -21, -22, -22, &
|
||||
-23, -24, -25, -26, -26, -27, -28, -29, -30, -30, &
|
||||
-31, -32, -33, -33, -34, -35, -36, -36, -37, -38, &
|
||||
-38, -39, -40, -41, -41, -42, -43, -43, -44, -45, &
|
||||
-45, -46, -47, -47, -48, -49, -49, -50, -51, -51, &
|
||||
-52, -53, -53, -54, -54, -55, -56, -56, -57, -57, &
|
||||
-58, -59, -59, -60, -60, -61, -62, -62, -62, -63, &
|
||||
-64, -64, -65, -65, -66, -67, -67, -67, -68, -69, &
|
||||
-69, -70, -70, -71, -72, -72, -72, -72, -73, -74, &
|
||||
-75, -75, -75, -77, -76, -76, -78, -78, -80, -81, &
|
||||
-80, -79, -83, -82, -81, -82, -82, -83, -84, -84, &
|
||||
-84, -87, -86, -87, -88, -89, -89, -89, -88, -87, &
|
||||
-86, -87, -84, -84, -84, -83, -82, -82, -81, -82, &
|
||||
-83, -79, -80, -81, -80, -78, -78, -76, -76, -77, &
|
||||
-75, -75, -75, -74, -73, -72, -72, -72, -72, -71, &
|
||||
-70, -70, -69, -69, -68, -67, -67, -67, -66, -65, &
|
||||
-65, -64, -64, -63, -62, -62, -62, -61, -60, -60, &
|
||||
-59, -59, -58, -57, -57, -56, -56, -55, -54, -54, &
|
||||
-53, -53, -52, -51, -51, -50, -49, -49, -48, -47, &
|
||||
-47, -46, -45, -45, -44, -43, -43, -42, -41, -41, &
|
||||
-40, -39, -38, -38, -37, -36, -36, -35, -34, -33, &
|
||||
-33, -32, -31, -30, -30, -29, -28, -27, -26, -26, &
|
||||
-25, -24, -23, -22, -22, -21, -20, -19, -18, -17, &
|
||||
-17, -16, -15, -14, -13, -12, -12, -11, -10, -9, &
|
||||
-8, -7, -7, -6, -5, -4, -4, -3, -2, -2, &
|
||||
-1, -1, -1, 0, 0, 1, 1, 1, 1, 2, &
|
||||
2, 2, 2, 2, 3, 3, 3, 3, 3, 3, &
|
||||
3, 3, 3, 4, 4, 4, 4, 4, 4, 4, &
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, &
|
||||
4, 4, 4, 4, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
|
||||
5, 5/
|
||||
|
||||
! Get command-line argument(s)
|
||||
nargs=iargc()
|
||||
if(nargs.ne.1) then
|
||||
print*,'Usage: WSPRcode "message"'
|
||||
go to 999
|
||||
endif
|
||||
call getarg(1,msg) !Get message from command line
|
||||
write(*,1000) msg
|
||||
1000 format('Message: ',a22)
|
||||
|
||||
nbits=50+31 !User bits=50, constraint length=32
|
||||
nbytes=(nbits+7)/8
|
||||
ndelta=50
|
||||
limit=20000
|
||||
|
||||
data0=0
|
||||
call wqencode(msg,ntype0,data0) !Source encoding
|
||||
write(*,1002) data0(1:7),data0(1:6),data0(7)/64
|
||||
1002 format(/'Source-encoded message, 50 bits:'/'Hex: ',7z3.2/ &
|
||||
'Binary: ',6b9.8,b3.2)
|
||||
|
||||
call encode232(data0,nbytes,dat,MAXSYM) !Convolutional encoding
|
||||
call inter_mept(dat,1) !Interleaving
|
||||
|
||||
write(*,1004)
|
||||
1004 format(/'Data symbols:')
|
||||
write(*,1006) (dat(i),i=1,NSYM)
|
||||
1006 format(5x,30i2)
|
||||
|
||||
write(*,1008)
|
||||
1008 format(/'Sync symbols:')
|
||||
write(*,1006) (sync(i),i=1,NSYM)
|
||||
|
||||
write(*,1010)
|
||||
1010 format(/'Channel symbols:')
|
||||
write(*,1006) (2*dat(i)+sync(i),i=1,NSYM)
|
||||
|
||||
call inter_mept(dat,-1) !Remove interleaving
|
||||
softsym=-dat !Simulate soft symbols
|
||||
|
||||
! Call the sequential (Fano algorithm) decoder
|
||||
call fano232(softsym,nbits,mettab,ndelta,limit,data1,ncycles,metric,nerr)
|
||||
call wqdecode(data1,msg2,ntype1)
|
||||
|
||||
write(*,1020) msg2,ntype1
|
||||
1020 format(/'Decoded message: ',a22,' ntype:',i3)
|
||||
|
||||
999 end program wsprcode
|
||||
|
||||
include 'wspr_old_subs.f90'
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
:doctype: manpage
|
||||
:man source: AsciiDoc
|
||||
:man version: {VERSION}
|
||||
:man manual: WSJT-X Manual
|
||||
= wsjtx(1)
|
||||
|
||||
== NAME
|
||||
|
||||
wsjtx, jt9 - Weak signal communications program.
|
||||
|
||||
== SYNOPSIS
|
||||
|
||||
*wsjtx* ['OPTIONS']
|
||||
|
||||
== DESCRIPTION
|
||||
|
||||
*wsjtx* is a weak signal communications program supporting several operating
|
||||
modes: JT65, JT9, JT4 and WSPR (*wsjtx* version 1 supported JT9 only).
|
||||
|
||||
WSJT-X home page:: http://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html
|
||||
|
||||
WSJT-X User's Guide::
|
||||
http://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/wsjtx-main-{VERSION}.html
|
||||
|
||||
An alternative JT65 decoder executable *kvasd* for i386 Ubuntu is
|
||||
available at http://www.physics.princeton.edu/pulsar/K1JT/kvasd .
|
||||
This decoder is not open-source, is not included in the wsjtx package,
|
||||
and is not required for JT65 decoding.
|
||||
|
||||
== OPTIONS
|
||||
*-r, --rig-name*[=RIGNAME]::
|
||||
|
||||
Enable multiple instances of the wsjtx(1) application to run
|
||||
concurrently. Each RIGNAME must be unique. One instance may use no
|
||||
RIGNAME. If this option is not supplied then only one instance of
|
||||
wsjtx(1) may be run at any time.
|
||||
|
||||
*-v, --version*:: Display the application version.
|
||||
|
||||
*-h,--help*:: Display usage information.
|
||||
|
||||
*--test-mode*::
|
||||
|
||||
When this option is provided all writable files will be placed in a
|
||||
special test location (~/.qttest). This option is only for
|
||||
application testing and is not designed for normal operations. **Use
|
||||
with caution**.
|
||||
|
||||
== FILES
|
||||
|
||||
Most of the following files are in a directory path containing the
|
||||
directory name *WSJT-X[ - RIGNAME]* which indicates the value of the
|
||||
command line option *--rig-name=RIGNAME* to indicate multiple instances of
|
||||
*wsjtx* running concurrently. All writable files listed below are
|
||||
therefore unique to each concurrent instance of *wsjtx*. If the
|
||||
*--rig-name* command line option is not supplied or the *RIGNAME* argument
|
||||
is not supplied then the directory paths below will have the directory
|
||||
*WSJT-X*.
|
||||
|
||||
~/.config/WSJT-X[ - RIGNAME].ini::
|
||||
|
||||
This file stores the application
|
||||
configuration settings.
|
||||
|
||||
~/.local/share/WSJT-X[ - RIGNAME]/ALL.txt::
|
||||
|
||||
*ALL.txt* contains a record of transmitted and received messages and
|
||||
other activity such as frequency or band changes.
|
||||
|
||||
~/.local/share/WSJT-X[ - RIGNAME]/save/::
|
||||
|
||||
Is the default location for saved .WAV files recorded by the
|
||||
application. The .WAV file save location may be changed in the
|
||||
applications settings dialog.
|
||||
|
||||
~/.local/share/WSJT-X[ - RIGNAME]/save/samples/::
|
||||
|
||||
Sample .WAV files suppied with the application are found in this
|
||||
directory, they may be played back in the application and are referred
|
||||
to in the user guide tutorial sections.
|
||||
|
||||
~/.local/share/WSJT-X[ -RIGNAME]/timer.out::
|
||||
|
||||
This is a diagnostic file that records decode performance profiling
|
||||
information.
|
||||
|
||||
~/.local/share/WSJT-X[ - RIGNAME]/cty.dat::
|
||||
|
||||
This file is not required as a version of it is embedded in the
|
||||
application, but if you wish an updated version can be placed here.
|
||||
If present that version will be used in preference to the embedded
|
||||
version.
|
||||
|
||||
~/.local/share/WSJT-X[ - RIGNAME]/wsjtx.log::
|
||||
|
||||
This is a plain text CSV record of logged QSOs.
|
||||
|
||||
~/.local/share/WSJT-X[ - RIGNAME]/wsjtx_log.adi::
|
||||
|
||||
This is a record of QSOs logged in the ADIF format which is suitable
|
||||
for import into many Ham Radio logging programs.
|
||||
|
||||
== AUTHOR
|
||||
|
||||
Joe Taylor, K1JT.
|
||||
|
||||
== COPYING
|
||||
|
||||
*wsjtx* is Copyright (C) 2001 - 2015 by Joseph H. Taylor, Jr., K1JT,
|
||||
with contributions from additional authors. WSJT-X is Open Source
|
||||
software, licensed under the GNU General Public License (GPLv3).
|
||||
|
||||
*wsjtx* includes the ``**Hamlib - Ham Radio Control Libraries**''
|
||||
software which is licensed under the GNU Lesser General Public License
|
||||
(LGPL). Home page https://sourceforge.net/apps/mediawiki/hamlib,
|
||||
sources from https://sourceforge.net/p/hamlib/code/ci/master/tree/.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
@@ -0,0 +1,33 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2011 Eric Niebler
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under 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)
|
||||
|
||||
This is an auto-generated file. Do not edit!
|
||||
==============================================================================*/
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
|
||||
template <typename T0>
|
||||
struct vector1;
|
||||
template <typename T0 , typename T1>
|
||||
struct vector2;
|
||||
template <typename T0 , typename T1 , typename T2>
|
||||
struct vector3;
|
||||
template <typename T0 , typename T1 , typename T2 , typename T3>
|
||||
struct vector4;
|
||||
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4>
|
||||
struct vector5;
|
||||
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5>
|
||||
struct vector6;
|
||||
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6>
|
||||
struct vector7;
|
||||
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7>
|
||||
struct vector8;
|
||||
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8>
|
||||
struct vector9;
|
||||
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
|
||||
struct vector10;
|
||||
}}
|
||||
@@ -0,0 +1,197 @@
|
||||
subroutine msk144spd(cbig,n,ntol,nsuccess,msgreceived,fc,fret,tret,navg,ct, &
|
||||
softbits,recent_calls,nrecent)
|
||||
|
||||
! MSK144 short-ping-decoder
|
||||
|
||||
use timer_module, only: timer
|
||||
|
||||
parameter (NSPM=864, MAXSTEPS=100, NFFT=NSPM, MAXCAND=5, NPATTERNS=6)
|
||||
character*22 msgreceived
|
||||
character*12 recent_calls(nrecent)
|
||||
complex cbig(n)
|
||||
complex cdat(3*NSPM) !Analytic signal
|
||||
complex c(NSPM)
|
||||
complex ct(NSPM)
|
||||
complex ctmp(NFFT)
|
||||
integer, dimension(1) :: iloc
|
||||
integer indices(MAXSTEPS)
|
||||
integer npkloc(10)
|
||||
integer navpatterns(3,NPATTERNS)
|
||||
integer navmask(3)
|
||||
integer nstart(MAXCAND)
|
||||
logical ismask(NFFT)
|
||||
real detmet(-2:MAXSTEPS+3)
|
||||
real detmet2(-2:MAXSTEPS+3)
|
||||
real detfer(MAXSTEPS)
|
||||
real rcw(12)
|
||||
real ferrs(MAXCAND)
|
||||
real snrs(MAXCAND)
|
||||
real softbits(144)
|
||||
real tonespec(NFFT)
|
||||
real tpat(NPATTERNS)
|
||||
real*8 dt, df, fs, pi, twopi
|
||||
logical first
|
||||
data first/.true./
|
||||
data navpatterns/ &
|
||||
0,1,0, &
|
||||
1,0,0, &
|
||||
0,0,1, &
|
||||
1,1,0, &
|
||||
0,1,1, &
|
||||
1,1,1/
|
||||
data tpat/1.5,0.5,2.5,1.0,2.0,1.5/
|
||||
|
||||
save df,first,fs,pi,twopi,dt,tframe,rcw
|
||||
|
||||
if(first) then
|
||||
nmatchedfilter=1
|
||||
! define half-sine pulse and raised-cosine edge window
|
||||
pi=4d0*datan(1d0)
|
||||
twopi=8d0*datan(1d0)
|
||||
fs=12000.0
|
||||
dt=1.0/fs
|
||||
df=fs/NFFT
|
||||
tframe=NSPM/fs
|
||||
|
||||
do i=1,12
|
||||
angle=(i-1)*pi/12.0
|
||||
rcw(i)=(1-cos(angle))/2
|
||||
enddo
|
||||
|
||||
first=.false.
|
||||
endif
|
||||
|
||||
! fill the detmet, detferr arrays
|
||||
nstep=(n-NSPM)/216 ! 72ms/4=18ms steps
|
||||
detmet=0
|
||||
detmet2=0
|
||||
detfer=-999.99
|
||||
nfhi=2*(fc+500)
|
||||
nflo=2*(fc-500)
|
||||
ihlo=nint((nfhi-2*ntol)/df) + 1
|
||||
ihhi=nint((nfhi+2*ntol)/df) + 1
|
||||
illo=nint((nflo-2*ntol)/df) + 1
|
||||
ilhi=nint((nflo+2*ntol)/df) + 1
|
||||
i2000=nint(nflo/df) + 1
|
||||
i4000=nint(nfhi/df) + 1
|
||||
do istp=1,nstep
|
||||
ns=1+216*(istp-1)
|
||||
ne=ns+NSPM-1
|
||||
if( ne .gt. n ) exit
|
||||
ctmp=cmplx(0.0,0.0)
|
||||
ctmp(1:NSPM)=cbig(ns:ne)
|
||||
|
||||
! Coarse carrier frequency sync - seek tones at 2000 Hz and 4000 Hz in
|
||||
! squared signal spectrum.
|
||||
|
||||
ctmp=ctmp**2
|
||||
ctmp(1:12)=ctmp(1:12)*rcw
|
||||
ctmp(NSPM-11:NSPM)=ctmp(NSPM-11:NSPM)*rcw(12:1:-1)
|
||||
call four2a(ctmp,NFFT,1,-1,1)
|
||||
tonespec=abs(ctmp)**2
|
||||
|
||||
ismask=.false.
|
||||
ismask(ihlo:ihhi)=.true. ! high tone search window
|
||||
iloc=maxloc(tonespec,ismask)
|
||||
ihpk=iloc(1)
|
||||
deltah=-real( (ctmp(ihpk-1)-ctmp(ihpk+1)) / (2*ctmp(ihpk)-ctmp(ihpk-1)-ctmp(ihpk+1)) )
|
||||
ah=tonespec(ihpk)
|
||||
ahavp=(sum(tonespec,ismask)-ah)/count(ismask)
|
||||
trath=ah/(ahavp+0.01)
|
||||
ismask=.false.
|
||||
ismask(illo:ilhi)=.true. ! window for low tone
|
||||
iloc=maxloc(tonespec,ismask)
|
||||
ilpk=iloc(1)
|
||||
deltal=-real( (ctmp(ilpk-1)-ctmp(ilpk+1)) / (2*ctmp(ilpk)-ctmp(ilpk-1)-ctmp(ilpk+1)) )
|
||||
al=tonespec(ilpk)
|
||||
alavp=(sum(tonespec,ismask)-al)/count(ismask)
|
||||
tratl=al/(alavp+0.01)
|
||||
fdiff=(ihpk+deltah-ilpk-deltal)*df
|
||||
ferrh=(ihpk+deltah-i4000)*df/2.0
|
||||
ferrl=(ilpk+deltal-i2000)*df/2.0
|
||||
if( ah .ge. al ) then
|
||||
ferr=ferrh
|
||||
else
|
||||
ferr=ferrl
|
||||
endif
|
||||
detmet(istp)=max(ah,al)
|
||||
detmet2(istp)=max(trath,tratl)
|
||||
detfer(istp)=ferr
|
||||
enddo ! end of detection-metric and frequency error estimation loop
|
||||
|
||||
call indexx(detmet(1:nstep),nstep,indices) !find median of detection metric vector
|
||||
xmed=detmet(indices(nstep/4))
|
||||
detmet=detmet/xmed ! noise floor of detection metric is 1.0
|
||||
ndet=0
|
||||
|
||||
do ip=1,MAXCAND ! Find candidates
|
||||
iloc=maxloc(detmet(1:nstep))
|
||||
il=iloc(1)
|
||||
if( (detmet(il) .lt. 3.0) ) exit
|
||||
if( abs(detfer(il)) .le. ntol ) then
|
||||
ndet=ndet+1
|
||||
nstart(ndet)=1+(il-1)*216+1
|
||||
ferrs(ndet)=detfer(il)
|
||||
snrs(ndet)=12.0*log10(detmet(il))/2-9.0
|
||||
endif
|
||||
detmet(il)=0.0
|
||||
enddo
|
||||
|
||||
if( ndet .lt. 3 ) then
|
||||
do ip=1,MAXCAND-ndet ! Find candidates
|
||||
iloc=maxloc(detmet2(1:nstep))
|
||||
il=iloc(1)
|
||||
if( (detmet2(il) .lt. 12.0) ) exit
|
||||
if( abs(detfer(il)) .le. ntol ) then
|
||||
ndet=ndet+1
|
||||
nstart(ndet)=1+(il-1)*216+1
|
||||
ferrs(ndet)=detfer(il)
|
||||
snrs(ndet)=12.0*log10(detmet2(il))/2-9.0
|
||||
endif
|
||||
detmet2(il)=0.0
|
||||
enddo
|
||||
endif
|
||||
|
||||
nsuccess=0
|
||||
msgreceived=' '
|
||||
npeaks=2
|
||||
ntol0=8
|
||||
deltaf=2.0
|
||||
do icand=1,ndet ! Try to sync/demod/decode each candidate.
|
||||
ib=max(1,nstart(icand)-NSPM)
|
||||
ie=ib-1+3*NSPM
|
||||
if( ie .gt. n ) then
|
||||
ie=n
|
||||
ib=ie-3*NSPM+1
|
||||
endif
|
||||
cdat=cbig(ib:ie)
|
||||
fo=fc+ferrs(icand)
|
||||
do iav=1,NPATTERNS
|
||||
navmask=navpatterns(1:3,iav)
|
||||
call msk144sync(cdat,3,ntol0,deltaf,navmask,npeaks,fo,fest,npkloc, &
|
||||
nsyncsuccess,xmax,c)
|
||||
|
||||
if( nsyncsuccess .eq. 0 ) cycle
|
||||
|
||||
do ipk=1,npeaks
|
||||
do is=1,3
|
||||
ic0=npkloc(ipk)
|
||||
if( is.eq.2) ic0=max(1,ic0-1)
|
||||
if( is.eq.3) ic0=min(NSPM,ic0+1)
|
||||
ct=cshift(c,ic0-1)
|
||||
call msk144decodeframe(ct,softbits,msgreceived,ndecodesuccess, &
|
||||
recent_calls,nrecent)
|
||||
if( ndecodesuccess .gt. 0 ) then
|
||||
tret=(nstart(icand)+NSPM/2)/fs
|
||||
fret=fest
|
||||
navg=sum(navmask)
|
||||
nsuccess=1
|
||||
return
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
enddo ! candidate loop
|
||||
|
||||
return
|
||||
end subroutine msk144spd
|
||||
@@ -0,0 +1,57 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// (C) Copyright Ion Gaztanaga 2014-2015. Distributed under 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)
|
||||
//
|
||||
// See http://www.boost.org/libs/interprocess for documentation.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
#ifndef BOOST_INTERPROCESS_DETAIL_STD_FWD_HPP
|
||||
#define BOOST_INTERPROCESS_DETAIL_STD_FWD_HPP
|
||||
|
||||
#ifndef BOOST_CONFIG_HPP
|
||||
# include <boost/config.hpp>
|
||||
#endif
|
||||
#
|
||||
#if defined(BOOST_HAS_PRAGMA_ONCE)
|
||||
# pragma once
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Standard predeclarations
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <boost/move/detail/std_ns_begin.hpp>
|
||||
BOOST_MOVE_STD_NS_BEG
|
||||
|
||||
struct input_iterator_tag;
|
||||
struct forward_iterator_tag;
|
||||
struct bidirectional_iterator_tag;
|
||||
struct random_access_iterator_tag;
|
||||
|
||||
template<class T>
|
||||
struct char_traits;
|
||||
|
||||
#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1800) &&defined(BOOST_DINKUMWARE_STDLIB)
|
||||
#define BOOST_INTERPROCESS_STD_FWD_MSVC_IOS_BUG
|
||||
// Compiler bug workaround. Previous versions (<= VC11)
|
||||
// used dummy virtual functions
|
||||
# pragma vtordisp(push, 2)
|
||||
#endif
|
||||
|
||||
template<class CharT, class Traits>
|
||||
class basic_ostream;
|
||||
|
||||
template<class CharT, class Traits>
|
||||
class basic_istream;
|
||||
|
||||
#ifdef BOOST_INTERPROCESS_STD_FWD_MSVC_IOS_BUG
|
||||
# pragma vtordisp(pop)
|
||||
# undef BOOST_INTERPROCESS_STD_FWD_MSVC_IOS_BUG
|
||||
#endif
|
||||
|
||||
BOOST_MOVE_STD_NS_END
|
||||
#include <boost/move/detail/std_ns_end.hpp>
|
||||
|
||||
#endif //#ifndef BOOST_INTERPROCESS_DETAIL_STD_FWD_HPP
|
||||
@@ -0,0 +1,530 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2011 John Maddock. Distributed under 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)
|
||||
|
||||
#ifndef BOOST_MP_GENERIC_INTERCONVERT_HPP
|
||||
#define BOOST_MP_GENERIC_INTERCONVERT_HPP
|
||||
|
||||
#include <boost/multiprecision/detail/default_ops.hpp>
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127 6326)
|
||||
#endif
|
||||
|
||||
namespace boost{ namespace multiprecision{ namespace detail{
|
||||
|
||||
template <class To, class From>
|
||||
inline To do_cast(const From & from)
|
||||
{
|
||||
return static_cast<To>(from);
|
||||
}
|
||||
template <class To, class B, ::boost::multiprecision::expression_template_option et>
|
||||
inline To do_cast(const number<B, et>& from)
|
||||
{
|
||||
return from.template convert_to<To>();
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_floating_point>& /*to_type*/, const mpl::int_<number_kind_integer>& /*from_type*/)
|
||||
{
|
||||
using default_ops::eval_get_sign;
|
||||
using default_ops::eval_bitwise_and;
|
||||
using default_ops::eval_convert_to;
|
||||
using default_ops::eval_right_shift;
|
||||
using default_ops::eval_ldexp;
|
||||
using default_ops::eval_add;
|
||||
using default_ops::eval_is_zero;
|
||||
// smallest unsigned type handled natively by "From" is likely to be it's limb_type:
|
||||
typedef typename canonical<unsigned char, From>::type l_limb_type;
|
||||
// get the corresponding type that we can assign to "To":
|
||||
typedef typename canonical<l_limb_type, To>::type to_type;
|
||||
From t(from);
|
||||
bool is_neg = eval_get_sign(t) < 0;
|
||||
if(is_neg)
|
||||
t.negate();
|
||||
// Pick off the first limb:
|
||||
l_limb_type limb;
|
||||
l_limb_type mask = static_cast<l_limb_type>(~static_cast<l_limb_type>(0));
|
||||
From fl;
|
||||
eval_bitwise_and(fl, t, mask);
|
||||
eval_convert_to(&limb, fl);
|
||||
to = static_cast<to_type>(limb);
|
||||
eval_right_shift(t, std::numeric_limits<l_limb_type>::digits);
|
||||
//
|
||||
// Then keep picking off more limbs until "t" is zero:
|
||||
//
|
||||
To l;
|
||||
unsigned shift = std::numeric_limits<l_limb_type>::digits;
|
||||
while(!eval_is_zero(t))
|
||||
{
|
||||
eval_bitwise_and(fl, t, mask);
|
||||
eval_convert_to(&limb, fl);
|
||||
l = static_cast<to_type>(limb);
|
||||
eval_right_shift(t, std::numeric_limits<l_limb_type>::digits);
|
||||
eval_ldexp(l, l, shift);
|
||||
eval_add(to, l);
|
||||
shift += std::numeric_limits<l_limb_type>::digits;
|
||||
}
|
||||
//
|
||||
// Finish off by setting the sign:
|
||||
//
|
||||
if(is_neg)
|
||||
to.negate();
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_integer>& /*to_type*/, const mpl::int_<number_kind_integer>& /*from_type*/)
|
||||
{
|
||||
using default_ops::eval_get_sign;
|
||||
using default_ops::eval_bitwise_and;
|
||||
using default_ops::eval_convert_to;
|
||||
using default_ops::eval_right_shift;
|
||||
using default_ops::eval_left_shift;
|
||||
using default_ops::eval_bitwise_or;
|
||||
using default_ops::eval_is_zero;
|
||||
// smallest unsigned type handled natively by "From" is likely to be it's limb_type:
|
||||
typedef typename canonical<unsigned char, From>::type limb_type;
|
||||
// get the corresponding type that we can assign to "To":
|
||||
typedef typename canonical<limb_type, To>::type to_type;
|
||||
From t(from);
|
||||
bool is_neg = eval_get_sign(t) < 0;
|
||||
if(is_neg)
|
||||
t.negate();
|
||||
// Pick off the first limb:
|
||||
limb_type limb;
|
||||
limb_type mask = static_cast<limb_type>(~static_cast<limb_type>(0));
|
||||
From fl;
|
||||
eval_bitwise_and(fl, t, mask);
|
||||
eval_convert_to(&limb, fl);
|
||||
to = static_cast<to_type>(limb);
|
||||
eval_right_shift(t, std::numeric_limits<limb_type>::digits);
|
||||
//
|
||||
// Then keep picking off more limbs until "t" is zero:
|
||||
//
|
||||
To l;
|
||||
unsigned shift = std::numeric_limits<limb_type>::digits;
|
||||
while(!eval_is_zero(t))
|
||||
{
|
||||
eval_bitwise_and(fl, t, mask);
|
||||
eval_convert_to(&limb, fl);
|
||||
l = static_cast<to_type>(limb);
|
||||
eval_right_shift(t, std::numeric_limits<limb_type>::digits);
|
||||
eval_left_shift(l, shift);
|
||||
eval_bitwise_or(to, l);
|
||||
shift += std::numeric_limits<limb_type>::digits;
|
||||
}
|
||||
//
|
||||
// Finish off by setting the sign:
|
||||
//
|
||||
if(is_neg)
|
||||
to.negate();
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_floating_point>& /*to_type*/, const mpl::int_<number_kind_floating_point>& /*from_type*/)
|
||||
{
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127)
|
||||
#endif
|
||||
//
|
||||
// The code here only works when the radix of "From" is 2, we could try shifting by other
|
||||
// radixes but it would complicate things.... use a string conversion when the radix is other
|
||||
// than 2:
|
||||
//
|
||||
if(std::numeric_limits<number<From> >::radix != 2)
|
||||
{
|
||||
to = from.str(0, std::ios_base::fmtflags()).c_str();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
typedef typename canonical<unsigned char, To>::type ui_type;
|
||||
|
||||
using default_ops::eval_fpclassify;
|
||||
using default_ops::eval_add;
|
||||
using default_ops::eval_subtract;
|
||||
using default_ops::eval_convert_to;
|
||||
using default_ops::eval_get_sign;
|
||||
using default_ops::eval_is_zero;
|
||||
|
||||
//
|
||||
// First classify the input, then handle the special cases:
|
||||
//
|
||||
int c = eval_fpclassify(from);
|
||||
|
||||
if(c == (int)FP_ZERO)
|
||||
{
|
||||
to = ui_type(0);
|
||||
return;
|
||||
}
|
||||
else if(c == (int)FP_NAN)
|
||||
{
|
||||
to = static_cast<const char*>("nan");
|
||||
return;
|
||||
}
|
||||
else if(c == (int)FP_INFINITE)
|
||||
{
|
||||
to = static_cast<const char*>("inf");
|
||||
if(eval_get_sign(from) < 0)
|
||||
to.negate();
|
||||
return;
|
||||
}
|
||||
|
||||
typename From::exponent_type e;
|
||||
From f, term;
|
||||
to = ui_type(0);
|
||||
|
||||
eval_frexp(f, from, &e);
|
||||
|
||||
static const int shift = std::numeric_limits<boost::intmax_t>::digits - 1;
|
||||
|
||||
while(!eval_is_zero(f))
|
||||
{
|
||||
// extract int sized bits from f:
|
||||
eval_ldexp(f, f, shift);
|
||||
eval_floor(term, f);
|
||||
e -= shift;
|
||||
eval_ldexp(to, to, shift);
|
||||
typename boost::multiprecision::detail::canonical<boost::intmax_t, To>::type ll;
|
||||
eval_convert_to(&ll, term);
|
||||
eval_add(to, ll);
|
||||
eval_subtract(f, term);
|
||||
}
|
||||
typedef typename To::exponent_type to_exponent;
|
||||
if((e > (std::numeric_limits<to_exponent>::max)()) || (e < (std::numeric_limits<to_exponent>::min)()))
|
||||
{
|
||||
to = static_cast<const char*>("inf");
|
||||
if(eval_get_sign(from) < 0)
|
||||
to.negate();
|
||||
return;
|
||||
}
|
||||
eval_ldexp(to, to, static_cast<to_exponent>(e));
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_rational>& /*to_type*/, const mpl::int_<number_kind_rational>& /*from_type*/)
|
||||
{
|
||||
typedef typename component_type<number<To> >::type to_component_type;
|
||||
|
||||
number<From> t(from);
|
||||
to_component_type n(numerator(t)), d(denominator(t));
|
||||
using default_ops::assign_components;
|
||||
assign_components(to, n.backend(), d.backend());
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_rational>& /*to_type*/, const mpl::int_<number_kind_integer>& /*from_type*/)
|
||||
{
|
||||
typedef typename component_type<number<To> >::type to_component_type;
|
||||
|
||||
number<From> t(from);
|
||||
to_component_type n(t), d(1);
|
||||
using default_ops::assign_components;
|
||||
assign_components(to, n.backend(), d.backend());
|
||||
}
|
||||
|
||||
template <class R, class LargeInteger>
|
||||
R safe_convert_to_float(const LargeInteger& i)
|
||||
{
|
||||
using std::ldexp;
|
||||
if(!i)
|
||||
return R(0);
|
||||
if(std::numeric_limits<R>::is_specialized && std::numeric_limits<R>::max_exponent)
|
||||
{
|
||||
LargeInteger val(i);
|
||||
if(val.sign() < 0)
|
||||
val = -val;
|
||||
unsigned mb = msb(val);
|
||||
if(mb >= std::numeric_limits<R>::max_exponent)
|
||||
{
|
||||
int scale_factor = (int)mb + 1 - std::numeric_limits<R>::max_exponent;
|
||||
BOOST_ASSERT(scale_factor >= 1);
|
||||
val >>= scale_factor;
|
||||
R result = val.template convert_to<R>();
|
||||
if(std::numeric_limits<R>::digits == 0 || std::numeric_limits<R>::digits >= std::numeric_limits<R>::max_exponent)
|
||||
{
|
||||
//
|
||||
// Calculate and add on the remainder, only if there are more
|
||||
// digits in the mantissa that the size of the exponent, in
|
||||
// other words if we are dropping digits in the conversion
|
||||
// otherwise:
|
||||
//
|
||||
LargeInteger remainder(i);
|
||||
remainder &= (LargeInteger(1) << scale_factor) - 1;
|
||||
result += ldexp(safe_convert_to_float<R>(remainder), -scale_factor);
|
||||
}
|
||||
return i.sign() < 0 ? static_cast<R>(-result) : result;
|
||||
}
|
||||
}
|
||||
return i.template convert_to<R>();
|
||||
}
|
||||
|
||||
template <class To, class Integer>
|
||||
inline typename disable_if_c<is_number<To>::value || is_floating_point<To>::value>::type
|
||||
generic_convert_rational_to_float_imp(To& result, const Integer& n, const Integer& d, const mpl::true_&)
|
||||
{
|
||||
//
|
||||
// If we get here, then there's something about one type or the other
|
||||
// that prevents an exactly rounded result from being calculated
|
||||
// (or at least it's not clear how to implement such a thing).
|
||||
//
|
||||
using default_ops::eval_divide;
|
||||
number<To> fn(safe_convert_to_float<number<To> >(n)), fd(safe_convert_to_float<number<To> >(d));
|
||||
eval_divide(result, fn.backend(), fd.backend());
|
||||
}
|
||||
template <class To, class Integer>
|
||||
inline typename enable_if_c<is_number<To>::value || is_floating_point<To>::value>::type
|
||||
generic_convert_rational_to_float_imp(To& result, const Integer& n, const Integer& d, const mpl::true_&)
|
||||
{
|
||||
//
|
||||
// If we get here, then there's something about one type or the other
|
||||
// that prevents an exactly rounded result from being calculated
|
||||
// (or at least it's not clear how to implement such a thing).
|
||||
//
|
||||
To fd(safe_convert_to_float<To>(d));
|
||||
result = safe_convert_to_float<To>(n);
|
||||
result /= fd;
|
||||
}
|
||||
|
||||
template <class To, class Integer>
|
||||
typename enable_if_c<is_number<To>::value || is_floating_point<To>::value>::type
|
||||
generic_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom, const mpl::false_&)
|
||||
{
|
||||
//
|
||||
// If we get here, then the precision of type To is known, and the integer type is unbounded
|
||||
// so we can use integer division plus manipulation of the remainder to get an exactly
|
||||
// rounded result.
|
||||
//
|
||||
if(num == 0)
|
||||
{
|
||||
result = 0;
|
||||
return;
|
||||
}
|
||||
bool s = false;
|
||||
if(num < 0)
|
||||
{
|
||||
s = true;
|
||||
num = -num;
|
||||
}
|
||||
int denom_bits = msb(denom);
|
||||
int shift = std::numeric_limits<To>::digits + denom_bits - msb(num);
|
||||
if(shift > 0)
|
||||
num <<= shift;
|
||||
else if(shift < 0)
|
||||
denom <<= boost::multiprecision::detail::unsigned_abs(shift);
|
||||
Integer q, r;
|
||||
divide_qr(num, denom, q, r);
|
||||
int q_bits = msb(q);
|
||||
if(q_bits == std::numeric_limits<To>::digits - 1)
|
||||
{
|
||||
//
|
||||
// Round up if 2 * r > denom:
|
||||
//
|
||||
r <<= 1;
|
||||
int c = r.compare(denom);
|
||||
if(c > 0)
|
||||
++q;
|
||||
else if((c == 0) && (q & 1u))
|
||||
{
|
||||
++q;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_ASSERT(q_bits == std::numeric_limits<To>::digits);
|
||||
//
|
||||
// We basically already have the rounding info:
|
||||
//
|
||||
if(q & 1u)
|
||||
{
|
||||
if(r || (q & 2u))
|
||||
++q;
|
||||
}
|
||||
}
|
||||
using std::ldexp;
|
||||
result = do_cast<To>(q);
|
||||
result = ldexp(result, -shift);
|
||||
if(s)
|
||||
result = -result;
|
||||
}
|
||||
template <class To, class Integer>
|
||||
inline typename disable_if_c<is_number<To>::value || is_floating_point<To>::value>::type
|
||||
generic_convert_rational_to_float_imp(To& result, Integer& num, Integer& denom, const mpl::false_& tag)
|
||||
{
|
||||
number<To> t;
|
||||
generic_convert_rational_to_float_imp(t, num, denom, tag);
|
||||
result = t.backend();
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
inline void generic_convert_rational_to_float(To& result, const From& f)
|
||||
{
|
||||
//
|
||||
// Type From is always a Backend to number<>, or an
|
||||
// instance of number<>, but we allow
|
||||
// To to be either a Backend type, or a real number type,
|
||||
// that way we can call this from generic conversions, and
|
||||
// from specific conversions to built in types.
|
||||
//
|
||||
typedef typename mpl::if_c<is_number<From>::value, From, number<From> >::type actual_from_type;
|
||||
typedef typename mpl::if_c<is_number<To>::value || is_floating_point<To>::value, To, number<To> >::type actual_to_type;
|
||||
typedef typename component_type<actual_from_type>::type integer_type;
|
||||
typedef mpl::bool_<!std::numeric_limits<integer_type>::is_specialized
|
||||
|| std::numeric_limits<integer_type>::is_bounded
|
||||
|| !std::numeric_limits<actual_to_type>::is_specialized
|
||||
|| !std::numeric_limits<actual_to_type>::is_bounded
|
||||
|| (std::numeric_limits<actual_to_type>::radix != 2)> dispatch_tag;
|
||||
|
||||
integer_type n(numerator(static_cast<actual_from_type>(f))), d(denominator(static_cast<actual_from_type>(f)));
|
||||
generic_convert_rational_to_float_imp(result, n, d, dispatch_tag());
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
inline void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_floating_point>& /*to_type*/, const mpl::int_<number_kind_rational>& /*from_type*/)
|
||||
{
|
||||
generic_convert_rational_to_float(to, from);
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert_float2rational(To& to, const From& from, const mpl::int_<2>& /*radix*/)
|
||||
{
|
||||
typedef typename mpl::front<typename To::unsigned_types>::type ui_type;
|
||||
static const int shift = std::numeric_limits<boost::long_long_type>::digits;
|
||||
typename From::exponent_type e;
|
||||
typename component_type<number<To> >::type num, denom;
|
||||
number<From> val(from);
|
||||
val = frexp(val, &e);
|
||||
while(val)
|
||||
{
|
||||
val = ldexp(val, shift);
|
||||
e -= shift;
|
||||
boost::long_long_type ll = boost::math::lltrunc(val);
|
||||
val -= ll;
|
||||
num <<= shift;
|
||||
num += ll;
|
||||
}
|
||||
denom = ui_type(1u);
|
||||
if(e < 0)
|
||||
denom <<= -e;
|
||||
else if(e > 0)
|
||||
num <<= e;
|
||||
assign_components(to, num.backend(), denom.backend());
|
||||
}
|
||||
|
||||
template <class To, class From, int Radix>
|
||||
void generic_interconvert_float2rational(To& to, const From& from, const mpl::int_<Radix>& /*radix*/)
|
||||
{
|
||||
//
|
||||
// This is almost the same as the binary case above, but we have to use
|
||||
// scalbn and ilogb rather than ldexp and frexp, we also only extract
|
||||
// one Radix digit at a time which is terribly inefficient!
|
||||
//
|
||||
typedef typename mpl::front<typename To::unsigned_types>::type ui_type;
|
||||
typename From::exponent_type e;
|
||||
typename component_type<number<To> >::type num, denom;
|
||||
number<From> val(from);
|
||||
e = ilogb(val);
|
||||
val = scalbn(val, -e);
|
||||
while(val)
|
||||
{
|
||||
boost::long_long_type ll = boost::math::lltrunc(val);
|
||||
val -= ll;
|
||||
val = scalbn(val, 1);
|
||||
num *= Radix;
|
||||
num += ll;
|
||||
--e;
|
||||
}
|
||||
++e;
|
||||
denom = ui_type(Radix);
|
||||
denom = pow(denom, abs(e));
|
||||
if(e > 0)
|
||||
{
|
||||
num *= denom;
|
||||
denom = 1;
|
||||
}
|
||||
assign_components(to, num.backend(), denom.backend());
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_rational>& /*to_type*/, const mpl::int_<number_kind_floating_point>& /*from_type*/)
|
||||
{
|
||||
generic_interconvert_float2rational(to, from, mpl::int_<std::numeric_limits<number<From> >::radix>());
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_integer>& /*to_type*/, const mpl::int_<number_kind_rational>& /*from_type*/)
|
||||
{
|
||||
number<From> t(from);
|
||||
number<To> result(numerator(t) / denominator(t));
|
||||
to = result.backend();
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert_float2int(To& to, const From& from, const mpl::int_<2>& /*radix*/)
|
||||
{
|
||||
typedef typename From::exponent_type exponent_type;
|
||||
static const exponent_type shift = std::numeric_limits<boost::long_long_type>::digits;
|
||||
exponent_type e;
|
||||
number<To> num(0u);
|
||||
number<From> val(from);
|
||||
val = frexp(val, &e);
|
||||
while(e > 0)
|
||||
{
|
||||
int s = (std::min)(e, shift);
|
||||
val = ldexp(val, s);
|
||||
e -= s;
|
||||
boost::long_long_type ll = boost::math::lltrunc(val);
|
||||
val -= ll;
|
||||
num <<= s;
|
||||
num += ll;
|
||||
}
|
||||
to = num.backend();
|
||||
}
|
||||
|
||||
template <class To, class From, int Radix>
|
||||
void generic_interconvert_float2int(To& to, const From& from, const mpl::int_<Radix>& /*radix*/)
|
||||
{
|
||||
//
|
||||
// This is almost the same as the binary case above, but we have to use
|
||||
// scalbn and ilogb rather than ldexp and frexp, we also only extract
|
||||
// one Radix digit at a time which is terribly inefficient!
|
||||
//
|
||||
typename From::exponent_type e;
|
||||
number<To> num(0u);
|
||||
number<From> val(from);
|
||||
e = ilogb(val);
|
||||
val = scalbn(val, -e);
|
||||
while(e >= 0)
|
||||
{
|
||||
boost::long_long_type ll = boost::math::lltrunc(val);
|
||||
val -= ll;
|
||||
val = scalbn(val, 1);
|
||||
num *= Radix;
|
||||
num += ll;
|
||||
--e;
|
||||
}
|
||||
to = num.backend();
|
||||
}
|
||||
|
||||
template <class To, class From>
|
||||
void generic_interconvert(To& to, const From& from, const mpl::int_<number_kind_integer>& /*to_type*/, const mpl::int_<number_kind_floating_point>& /*from_type*/)
|
||||
{
|
||||
generic_interconvert_float2int(to, from, mpl::int_<std::numeric_limits<number<From> >::radix>());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
} // namespaces
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif // BOOST_MP_GENERIC_INTERCONVERT_HPP
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright 2005 Daniel Wallin.
|
||||
// Copyright 2005 Joel de Guzman.
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
// Modeled after range_ex, Copyright 2004 Eric Niebler
|
||||
|
||||
#ifndef BOOST_PHOENIX_ALGORITHM_DETAIL_DECAY_ARRAY_HPP
|
||||
#define BOOST_PHOENIX_ALGORITHM_DETAIL_DECAY_ARRAY_HPP
|
||||
|
||||
namespace boost { namespace phoenix {
|
||||
namespace detail
|
||||
{
|
||||
template<typename T>
|
||||
struct decay_array
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template<typename T, int N>
|
||||
struct decay_array<T[N]>
|
||||
{
|
||||
typedef T* type;
|
||||
};
|
||||
|
||||
template<typename T, int N>
|
||||
struct decay_array<T (&)[N]>
|
||||
{
|
||||
typedef T* type;
|
||||
};
|
||||
}
|
||||
}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
[auto_generated]
|
||||
boost/numeric/odeint/algebra/fusion_algebra.hpp
|
||||
|
||||
[begin_description]
|
||||
Algebra for boost::fusion sequences.
|
||||
[end_description]
|
||||
|
||||
Copyright 2011-2013 Karsten Ahnert
|
||||
Copyright 2011-2013 Mario Mulansky
|
||||
|
||||
Distributed under 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)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_HPP_INCLUDED
|
||||
#define BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_HPP_INCLUDED
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <boost/numeric/odeint/config.hpp>
|
||||
|
||||
#include <boost/fusion/container/vector.hpp>
|
||||
#include <boost/fusion/algorithm/iteration/for_each.hpp>
|
||||
#include <boost/fusion/view/zip_view.hpp>
|
||||
#include <boost/fusion/functional/generation/make_fused.hpp>
|
||||
#include <boost/fusion/algorithm/iteration/accumulate.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace numeric {
|
||||
namespace odeint {
|
||||
|
||||
namespace detail {
|
||||
|
||||
template< class Value >
|
||||
struct fusion_maximum
|
||||
{
|
||||
template< class Fac1 , class Fac2 >
|
||||
Value operator()( Fac1 t1 , const Fac2 t2 ) const
|
||||
{
|
||||
using std::abs;
|
||||
Value a1 = abs( get_unit_value( t1 ) ) , a2 = abs( get_unit_value( t2 ) );
|
||||
return ( a1 < a2 ) ? a2 : a1 ;
|
||||
}
|
||||
|
||||
typedef Value result_type;
|
||||
};
|
||||
}
|
||||
|
||||
/* specialize this if the fundamental numeric type in your fusion sequence is
|
||||
* anything else but double (most likely not)
|
||||
*/
|
||||
template< typename Sequence >
|
||||
struct fusion_traits {
|
||||
typedef double value_type;
|
||||
};
|
||||
|
||||
struct fusion_algebra
|
||||
{
|
||||
template< class S1 , class Op >
|
||||
static void for_each1( S1 &s1 , Op op )
|
||||
{
|
||||
boost::fusion::for_each( s1 , op );
|
||||
};
|
||||
|
||||
|
||||
template< class S1 , class S2 , class Op >
|
||||
static void for_each2( S1 &s1 , S2 &s2 , Op op )
|
||||
{
|
||||
typedef boost::fusion::vector< S1& , S2& > Sequences;
|
||||
Sequences sequences( s1 , s2 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
|
||||
template< class S1 , class S2 , class S3 , class Op >
|
||||
static void for_each3( S1 &s1 , S2 &s2 , S3 &s3 , Op op )
|
||||
{
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class Op >
|
||||
static void for_each4( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op )
|
||||
{
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class Op >
|
||||
static void for_each5( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op )
|
||||
{
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op >
|
||||
static void for_each6( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op )
|
||||
{
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class Op >
|
||||
static void for_each7( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op )
|
||||
{
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class Op >
|
||||
static void for_each8( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 8 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class Op >
|
||||
static void for_each9( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 9 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class Op >
|
||||
static void for_each10( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 10 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class Op >
|
||||
static void for_each11( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 11 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 11 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class Op >
|
||||
static void for_each12( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 12 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 12 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class Op >
|
||||
static void for_each13( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 13 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 13 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& , S13& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class Op >
|
||||
static void for_each14( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 14 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 14 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& , S13& , S14& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class S15 , class Op >
|
||||
static void for_each15( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , S15 &s15 , Op op )
|
||||
{
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 15 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
||||
BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 15 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
||||
typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& , S13& , S14& , S15& > Sequences;
|
||||
Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 , s15 );
|
||||
boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
||||
}
|
||||
|
||||
template< class S >
|
||||
static typename fusion_traits< S >::value_type norm_inf( const S &s )
|
||||
{
|
||||
typedef typename fusion_traits< S >::value_type value_type;
|
||||
return boost::fusion::accumulate( s , static_cast<value_type>(0) ,
|
||||
detail::fusion_maximum<value_type>() );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
} // odeint
|
||||
} // numeric
|
||||
} // boost
|
||||
|
||||
|
||||
#endif // BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_HPP_INCLUDED
|
||||
@@ -0,0 +1,68 @@
|
||||
#ifndef BOOST_SERIALIZATION_ITEM_VERSION_TYPE_HPP
|
||||
#define BOOST_SERIALIZATION_ITEM_VERSION_TYPE_HPP
|
||||
|
||||
// (C) Copyright 2010 Robert Ramey
|
||||
// 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)
|
||||
|
||||
#include <boost/cstdint.hpp> // uint_least8_t
|
||||
#include <boost/integer_traits.hpp>
|
||||
#include <boost/serialization/level.hpp>
|
||||
#include <boost/serialization/is_bitwise_serializable.hpp>
|
||||
|
||||
// fixes broken example build on x86_64-linux-gnu-gcc-4.6.0
|
||||
#include <boost/assert.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4244 4267 )
|
||||
#endif
|
||||
|
||||
class item_version_type {
|
||||
private:
|
||||
typedef unsigned int base_type;
|
||||
base_type t;
|
||||
public:
|
||||
// should be private - but MPI fails if it's not!!!
|
||||
item_version_type(): t(0) {};
|
||||
explicit item_version_type(const unsigned int t_) : t(t_){
|
||||
BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);
|
||||
}
|
||||
item_version_type(const item_version_type & t_) :
|
||||
t(t_.t)
|
||||
{}
|
||||
item_version_type & operator=(item_version_type rhs){
|
||||
t = rhs.t;
|
||||
return *this;
|
||||
}
|
||||
// used for text output
|
||||
operator base_type () const {
|
||||
return t;
|
||||
}
|
||||
// used for text input
|
||||
operator base_type & () {
|
||||
return t;
|
||||
}
|
||||
bool operator==(const item_version_type & rhs) const {
|
||||
return t == rhs.t;
|
||||
}
|
||||
bool operator<(const item_version_type & rhs) const {
|
||||
return t < rhs.t;
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning( pop )
|
||||
#endif
|
||||
|
||||
} } // end namespace boost::serialization
|
||||
|
||||
BOOST_IS_BITWISE_SERIALIZABLE(item_version_type)
|
||||
|
||||
BOOST_CLASS_IMPLEMENTATION(item_version_type, primitive_type)
|
||||
|
||||
#endif //BOOST_SERIALIZATION_ITEM_VERSION_TYPE_HPP
|
||||
@@ -0,0 +1,63 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Copyright 2015 John Maddock. Distributed under 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)
|
||||
|
||||
#ifndef BOOST_MP_IS_BACKEND_HPP
|
||||
#define BOOST_MP_IS_BACKEND_HPP
|
||||
|
||||
#include <boost/mpl/has_xxx.hpp>
|
||||
#include <boost/type_traits/conditional.hpp>
|
||||
#include <boost/type_traits/is_convertible.hpp>
|
||||
#include <boost/multiprecision/detail/number_base.hpp>
|
||||
|
||||
namespace boost{ namespace multiprecision{ namespace detail{
|
||||
|
||||
BOOST_MPL_HAS_XXX_TRAIT_DEF(signed_types);
|
||||
BOOST_MPL_HAS_XXX_TRAIT_DEF(unsigned_types);
|
||||
BOOST_MPL_HAS_XXX_TRAIT_DEF(float_types);
|
||||
|
||||
template <class T>
|
||||
struct is_backend
|
||||
{
|
||||
static const bool value = has_signed_types<T>::value && has_unsigned_types<T>::value && has_float_types<T>::value;
|
||||
};
|
||||
|
||||
template <class Backend>
|
||||
struct other_backend
|
||||
{
|
||||
typedef typename boost::conditional<
|
||||
boost::is_same<number<Backend>, number<Backend, et_on> >::value,
|
||||
number<Backend, et_off>, number<Backend, et_on> >::type type;
|
||||
};
|
||||
|
||||
template <class B, class V>
|
||||
struct number_from_backend
|
||||
{
|
||||
typedef typename boost::conditional <
|
||||
boost::is_convertible<V, number<B> >::value,
|
||||
number<B>,
|
||||
typename other_backend<B>::type > ::type type;
|
||||
};
|
||||
|
||||
template <bool b, class T, class U>
|
||||
struct is_first_backend_imp{ static const bool value = false; };
|
||||
template <class T, class U>
|
||||
struct is_first_backend_imp<true, T, U>{ static const bool value = is_convertible<U, number<T, et_on> >::value || is_convertible<U, number<T, et_off> >::value; };
|
||||
|
||||
template <class T, class U>
|
||||
struct is_first_backend : is_first_backend_imp<is_backend<T>::value, T, U> {};
|
||||
|
||||
template <bool b, class T, class U>
|
||||
struct is_second_backend_imp{ static const bool value = false; };
|
||||
template <class T, class U>
|
||||
struct is_second_backend_imp<true, T, U>{ static const bool value = (is_convertible<T, number<U, et_on> >::value || is_convertible<T, number<U, et_off> >::value) && !is_first_backend<T, U>::value; };
|
||||
|
||||
template <class T, class U>
|
||||
struct is_second_backend : is_second_backend_imp<is_backend<U>::value, T, U> {};
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // BOOST_MP_IS_BACKEND_HPP
|
||||
@@ -0,0 +1,195 @@
|
||||
// (C) Copyright John Maddock 2006.
|
||||
// (C) Copyright Paul A. Bristow 2006.
|
||||
// Use, modification and distribution are 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)
|
||||
|
||||
#ifndef BOOST_STATS_COMPLEMENT_HPP
|
||||
#define BOOST_STATS_COMPLEMENT_HPP
|
||||
|
||||
//
|
||||
// This code really defines our own tuple type.
|
||||
// It would be nice to reuse boost::math::tuple
|
||||
// while retaining our own type safety, but it's
|
||||
// not clear if that's possible. In any case this
|
||||
// code is *very* lightweight.
|
||||
//
|
||||
namespace boost{ namespace math{
|
||||
|
||||
template <class Dist, class RealType>
|
||||
struct complemented2_type
|
||||
{
|
||||
complemented2_type(
|
||||
const Dist& d,
|
||||
const RealType& p1)
|
||||
: dist(d),
|
||||
param(p1) {}
|
||||
|
||||
const Dist& dist;
|
||||
const RealType& param;
|
||||
|
||||
private:
|
||||
complemented2_type& operator=(const complemented2_type&);
|
||||
};
|
||||
|
||||
template <class Dist, class RealType1, class RealType2>
|
||||
struct complemented3_type
|
||||
{
|
||||
complemented3_type(
|
||||
const Dist& d,
|
||||
const RealType1& p1,
|
||||
const RealType2& p2)
|
||||
: dist(d),
|
||||
param1(p1),
|
||||
param2(p2) {}
|
||||
|
||||
const Dist& dist;
|
||||
const RealType1& param1;
|
||||
const RealType2& param2;
|
||||
private:
|
||||
complemented3_type& operator=(const complemented3_type&);
|
||||
};
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3>
|
||||
struct complemented4_type
|
||||
{
|
||||
complemented4_type(
|
||||
const Dist& d,
|
||||
const RealType1& p1,
|
||||
const RealType2& p2,
|
||||
const RealType3& p3)
|
||||
: dist(d),
|
||||
param1(p1),
|
||||
param2(p2),
|
||||
param3(p3) {}
|
||||
|
||||
const Dist& dist;
|
||||
const RealType1& param1;
|
||||
const RealType2& param2;
|
||||
const RealType3& param3;
|
||||
private:
|
||||
complemented4_type& operator=(const complemented4_type&);
|
||||
};
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
|
||||
struct complemented5_type
|
||||
{
|
||||
complemented5_type(
|
||||
const Dist& d,
|
||||
const RealType1& p1,
|
||||
const RealType2& p2,
|
||||
const RealType3& p3,
|
||||
const RealType4& p4)
|
||||
: dist(d),
|
||||
param1(p1),
|
||||
param2(p2),
|
||||
param3(p3),
|
||||
param4(p4) {}
|
||||
|
||||
const Dist& dist;
|
||||
const RealType1& param1;
|
||||
const RealType2& param2;
|
||||
const RealType3& param3;
|
||||
const RealType4& param4;
|
||||
private:
|
||||
complemented5_type& operator=(const complemented5_type&);
|
||||
};
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
|
||||
struct complemented6_type
|
||||
{
|
||||
complemented6_type(
|
||||
const Dist& d,
|
||||
const RealType1& p1,
|
||||
const RealType2& p2,
|
||||
const RealType3& p3,
|
||||
const RealType4& p4,
|
||||
const RealType5& p5)
|
||||
: dist(d),
|
||||
param1(p1),
|
||||
param2(p2),
|
||||
param3(p3),
|
||||
param4(p4),
|
||||
param5(p5) {}
|
||||
|
||||
const Dist& dist;
|
||||
const RealType1& param1;
|
||||
const RealType2& param2;
|
||||
const RealType3& param3;
|
||||
const RealType4& param4;
|
||||
const RealType5& param5;
|
||||
private:
|
||||
complemented6_type& operator=(const complemented6_type&);
|
||||
};
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
|
||||
struct complemented7_type
|
||||
{
|
||||
complemented7_type(
|
||||
const Dist& d,
|
||||
const RealType1& p1,
|
||||
const RealType2& p2,
|
||||
const RealType3& p3,
|
||||
const RealType4& p4,
|
||||
const RealType5& p5,
|
||||
const RealType6& p6)
|
||||
: dist(d),
|
||||
param1(p1),
|
||||
param2(p2),
|
||||
param3(p3),
|
||||
param4(p4),
|
||||
param5(p5),
|
||||
param6(p6) {}
|
||||
|
||||
const Dist& dist;
|
||||
const RealType1& param1;
|
||||
const RealType2& param2;
|
||||
const RealType3& param3;
|
||||
const RealType4& param4;
|
||||
const RealType5& param5;
|
||||
const RealType6& param6;
|
||||
private:
|
||||
complemented7_type& operator=(const complemented7_type&);
|
||||
};
|
||||
|
||||
template <class Dist, class RealType>
|
||||
inline complemented2_type<Dist, RealType> complement(const Dist& d, const RealType& r)
|
||||
{
|
||||
return complemented2_type<Dist, RealType>(d, r);
|
||||
}
|
||||
|
||||
template <class Dist, class RealType1, class RealType2>
|
||||
inline complemented3_type<Dist, RealType1, RealType2> complement(const Dist& d, const RealType1& r1, const RealType2& r2)
|
||||
{
|
||||
return complemented3_type<Dist, RealType1, RealType2>(d, r1, r2);
|
||||
}
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3>
|
||||
inline complemented4_type<Dist, RealType1, RealType2, RealType3> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3)
|
||||
{
|
||||
return complemented4_type<Dist, RealType1, RealType2, RealType3>(d, r1, r2, r3);
|
||||
}
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
|
||||
inline complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4)
|
||||
{
|
||||
return complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4>(d, r1, r2, r3, r4);
|
||||
}
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
|
||||
inline complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5)
|
||||
{
|
||||
return complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5>(d, r1, r2, r3, r4, r5);
|
||||
}
|
||||
|
||||
template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
|
||||
inline complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5, const RealType6& r6)
|
||||
{
|
||||
return complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6>(d, r1, r2, r3, r4, r5, r6);
|
||||
}
|
||||
|
||||
} // namespace math
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_STATS_COMPLEMENT_HPP
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
|
||||
// (C) Copyright Tobias Schwinger
|
||||
//
|
||||
// Use modification and distribution are subject to the boost Software License,
|
||||
// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// no include guards, this file is intended for multiple inclusion
|
||||
|
||||
// input: BOOST_FT_syntax type macro to use
|
||||
// input: BOOST_FT_cc empty or cc specifier
|
||||
// input: BOOST_FT_ell empty or "..."
|
||||
// input: BOOST_FT_cv empty or cv qualifiers
|
||||
// input: BOOST_FT_flags single decimal integer encoding the flags
|
||||
// output: BOOST_FT_n number of component types (arity+1)
|
||||
// output: BOOST_FT_arity current arity
|
||||
// output: BOOST_FT_type macro that expands to the type
|
||||
// output: BOOST_FT_tplargs(p) template arguments with given prefix
|
||||
// output: BOOST_FT_params(p) parameters with given prefix
|
||||
|
||||
# include <boost/function_types/detail/components_impl/arity10_1.hpp>
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,11> function_arity;
|
||||
typedef mpl::vector12< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,12> function_arity;
|
||||
typedef mpl::vector13< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,13> function_arity;
|
||||
typedef mpl::vector14< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,14> function_arity;
|
||||
typedef mpl::vector15< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,15> function_arity;
|
||||
typedef mpl::vector16< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,16> function_arity;
|
||||
typedef mpl::vector17< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,17> function_arity;
|
||||
typedef mpl::vector18< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,18> function_arity;
|
||||
typedef mpl::vector19< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,19> function_arity;
|
||||
typedef mpl::vector20< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
|
||||
};
|
||||
template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
|
||||
struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv, L>
|
||||
{
|
||||
typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
|
||||
typedef constant<BOOST_FT_full_mask> mask;
|
||||
typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv, L> type;
|
||||
typedef components_mpl_sequence_tag tag;
|
||||
typedef mpl::integral_c<std::size_t,20> function_arity;
|
||||
typedef mpl::vector21< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,478 @@
|
||||
// Copyright John Maddock 2006.
|
||||
// Use, modification and distribution are 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)
|
||||
|
||||
// Test real concept.
|
||||
|
||||
// real_concept is an archetype for User defined Real types.
|
||||
|
||||
// This file defines the features, constructors, operators, functions...
|
||||
// that are essential to use mathematical and statistical functions.
|
||||
// The template typename "RealType" is used where this type
|
||||
// (as well as the normal built-in types, float, double & long double)
|
||||
// can be used.
|
||||
// That this is the minimum set is confirmed by use as a type
|
||||
// in tests of all functions & distributions, for example:
|
||||
// test_spots(0.F); & test_spots(0.); for float and double, but also
|
||||
// test_spots(boost::math::concepts::real_concept(0.));
|
||||
// NTL quad_float type is an example of a type meeting the requirements,
|
||||
// but note minor additions are needed - see ntl.diff and documentation
|
||||
// "Using With NTL - a High-Precision Floating-Point Library".
|
||||
|
||||
#ifndef BOOST_MATH_REAL_CONCEPT_HPP
|
||||
#define BOOST_MATH_REAL_CONCEPT_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/limits.hpp>
|
||||
#include <boost/math/special_functions/round.hpp>
|
||||
#include <boost/math/special_functions/trunc.hpp>
|
||||
#include <boost/math/special_functions/modf.hpp>
|
||||
#include <boost/math/tools/big_constant.hpp>
|
||||
#include <boost/math/tools/precision.hpp>
|
||||
#include <boost/math/policies/policy.hpp>
|
||||
#if defined(__SGI_STL_PORT)
|
||||
# include <boost/math/tools/real_cast.hpp>
|
||||
#endif
|
||||
#include <ostream>
|
||||
#include <istream>
|
||||
#include <boost/config/no_tr1/cmath.hpp>
|
||||
#include <math.h> // fmodl
|
||||
|
||||
#if defined(__SGI_STL_PORT) || defined(_RWSTD_VER) || defined(__LIBCOMO__)
|
||||
# include <cstdio>
|
||||
#endif
|
||||
|
||||
namespace boost{ namespace math{
|
||||
|
||||
namespace concepts
|
||||
{
|
||||
|
||||
#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
|
||||
typedef double real_concept_base_type;
|
||||
#else
|
||||
typedef long double real_concept_base_type;
|
||||
#endif
|
||||
|
||||
class real_concept
|
||||
{
|
||||
public:
|
||||
// Constructors:
|
||||
real_concept() : m_value(0){}
|
||||
real_concept(char c) : m_value(c){}
|
||||
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
|
||||
real_concept(wchar_t c) : m_value(c){}
|
||||
#endif
|
||||
real_concept(unsigned char c) : m_value(c){}
|
||||
real_concept(signed char c) : m_value(c){}
|
||||
real_concept(unsigned short c) : m_value(c){}
|
||||
real_concept(short c) : m_value(c){}
|
||||
real_concept(unsigned int c) : m_value(c){}
|
||||
real_concept(int c) : m_value(c){}
|
||||
real_concept(unsigned long c) : m_value(c){}
|
||||
real_concept(long c) : m_value(c){}
|
||||
#if defined(__DECCXX) || defined(__SUNPRO_CC)
|
||||
real_concept(unsigned long long c) : m_value(static_cast<real_concept_base_type>(c)){}
|
||||
real_concept(long long c) : m_value(static_cast<real_concept_base_type>(c)){}
|
||||
#elif defined(BOOST_HAS_LONG_LONG)
|
||||
real_concept(boost::ulong_long_type c) : m_value(static_cast<real_concept_base_type>(c)){}
|
||||
real_concept(boost::long_long_type c) : m_value(static_cast<real_concept_base_type>(c)){}
|
||||
#elif defined(BOOST_HAS_MS_INT64)
|
||||
real_concept(unsigned __int64 c) : m_value(static_cast<real_concept_base_type>(c)){}
|
||||
real_concept(__int64 c) : m_value(static_cast<real_concept_base_type>(c)){}
|
||||
#endif
|
||||
real_concept(float c) : m_value(c){}
|
||||
real_concept(double c) : m_value(c){}
|
||||
real_concept(long double c) : m_value(c){}
|
||||
#ifdef BOOST_MATH_USE_FLOAT128
|
||||
real_concept(BOOST_MATH_FLOAT128_TYPE c) : m_value(c){}
|
||||
#endif
|
||||
|
||||
// Assignment:
|
||||
real_concept& operator=(char c) { m_value = c; return *this; }
|
||||
real_concept& operator=(unsigned char c) { m_value = c; return *this; }
|
||||
real_concept& operator=(signed char c) { m_value = c; return *this; }
|
||||
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
|
||||
real_concept& operator=(wchar_t c) { m_value = c; return *this; }
|
||||
#endif
|
||||
real_concept& operator=(short c) { m_value = c; return *this; }
|
||||
real_concept& operator=(unsigned short c) { m_value = c; return *this; }
|
||||
real_concept& operator=(int c) { m_value = c; return *this; }
|
||||
real_concept& operator=(unsigned int c) { m_value = c; return *this; }
|
||||
real_concept& operator=(long c) { m_value = c; return *this; }
|
||||
real_concept& operator=(unsigned long c) { m_value = c; return *this; }
|
||||
#ifdef BOOST_HAS_LONG_LONG
|
||||
real_concept& operator=(boost::long_long_type c) { m_value = static_cast<real_concept_base_type>(c); return *this; }
|
||||
real_concept& operator=(boost::ulong_long_type c) { m_value = static_cast<real_concept_base_type>(c); return *this; }
|
||||
#endif
|
||||
real_concept& operator=(float c) { m_value = c; return *this; }
|
||||
real_concept& operator=(double c) { m_value = c; return *this; }
|
||||
real_concept& operator=(long double c) { m_value = c; return *this; }
|
||||
|
||||
// Access:
|
||||
real_concept_base_type value()const{ return m_value; }
|
||||
|
||||
// Member arithmetic:
|
||||
real_concept& operator+=(const real_concept& other)
|
||||
{ m_value += other.value(); return *this; }
|
||||
real_concept& operator-=(const real_concept& other)
|
||||
{ m_value -= other.value(); return *this; }
|
||||
real_concept& operator*=(const real_concept& other)
|
||||
{ m_value *= other.value(); return *this; }
|
||||
real_concept& operator/=(const real_concept& other)
|
||||
{ m_value /= other.value(); return *this; }
|
||||
real_concept operator-()const
|
||||
{ return -m_value; }
|
||||
real_concept const& operator+()const
|
||||
{ return *this; }
|
||||
real_concept& operator++()
|
||||
{ ++m_value; return *this; }
|
||||
real_concept& operator--()
|
||||
{ --m_value; return *this; }
|
||||
|
||||
private:
|
||||
real_concept_base_type m_value;
|
||||
};
|
||||
|
||||
// Non-member arithmetic:
|
||||
inline real_concept operator+(const real_concept& a, const real_concept& b)
|
||||
{
|
||||
real_concept result(a);
|
||||
result += b;
|
||||
return result;
|
||||
}
|
||||
inline real_concept operator-(const real_concept& a, const real_concept& b)
|
||||
{
|
||||
real_concept result(a);
|
||||
result -= b;
|
||||
return result;
|
||||
}
|
||||
inline real_concept operator*(const real_concept& a, const real_concept& b)
|
||||
{
|
||||
real_concept result(a);
|
||||
result *= b;
|
||||
return result;
|
||||
}
|
||||
inline real_concept operator/(const real_concept& a, const real_concept& b)
|
||||
{
|
||||
real_concept result(a);
|
||||
result /= b;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Comparison:
|
||||
inline bool operator == (const real_concept& a, const real_concept& b)
|
||||
{ return a.value() == b.value(); }
|
||||
inline bool operator != (const real_concept& a, const real_concept& b)
|
||||
{ return a.value() != b.value();}
|
||||
inline bool operator < (const real_concept& a, const real_concept& b)
|
||||
{ return a.value() < b.value(); }
|
||||
inline bool operator <= (const real_concept& a, const real_concept& b)
|
||||
{ return a.value() <= b.value(); }
|
||||
inline bool operator > (const real_concept& a, const real_concept& b)
|
||||
{ return a.value() > b.value(); }
|
||||
inline bool operator >= (const real_concept& a, const real_concept& b)
|
||||
{ return a.value() >= b.value(); }
|
||||
|
||||
// Non-member functions:
|
||||
inline real_concept acos(real_concept a)
|
||||
{ return std::acos(a.value()); }
|
||||
inline real_concept cos(real_concept a)
|
||||
{ return std::cos(a.value()); }
|
||||
inline real_concept asin(real_concept a)
|
||||
{ return std::asin(a.value()); }
|
||||
inline real_concept atan(real_concept a)
|
||||
{ return std::atan(a.value()); }
|
||||
inline real_concept atan2(real_concept a, real_concept b)
|
||||
{ return std::atan2(a.value(), b.value()); }
|
||||
inline real_concept ceil(real_concept a)
|
||||
{ return std::ceil(a.value()); }
|
||||
#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
|
||||
// I've seen std::fmod(long double) crash on some platforms
|
||||
// so use fmodl instead:
|
||||
#ifdef _WIN32_WCE
|
||||
//
|
||||
// Ugly workaround for macro fmodl:
|
||||
//
|
||||
inline long double call_fmodl(long double a, long double b)
|
||||
{ return fmodl(a, b); }
|
||||
inline real_concept fmod(real_concept a, real_concept b)
|
||||
{ return call_fmodl(a.value(), b.value()); }
|
||||
#else
|
||||
inline real_concept fmod(real_concept a, real_concept b)
|
||||
{ return fmodl(a.value(), b.value()); }
|
||||
#endif
|
||||
#endif
|
||||
inline real_concept cosh(real_concept a)
|
||||
{ return std::cosh(a.value()); }
|
||||
inline real_concept exp(real_concept a)
|
||||
{ return std::exp(a.value()); }
|
||||
inline real_concept fabs(real_concept a)
|
||||
{ return std::fabs(a.value()); }
|
||||
inline real_concept abs(real_concept a)
|
||||
{ return std::abs(a.value()); }
|
||||
inline real_concept floor(real_concept a)
|
||||
{ return std::floor(a.value()); }
|
||||
inline real_concept modf(real_concept a, real_concept* ipart)
|
||||
{
|
||||
#ifdef __MINGW32__
|
||||
real_concept_base_type ip;
|
||||
real_concept_base_type result = boost::math::modf(a.value(), &ip);
|
||||
*ipart = ip;
|
||||
return result;
|
||||
#else
|
||||
real_concept_base_type ip;
|
||||
real_concept_base_type result = std::modf(a.value(), &ip);
|
||||
*ipart = ip;
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
inline real_concept frexp(real_concept a, int* expon)
|
||||
{ return std::frexp(a.value(), expon); }
|
||||
inline real_concept ldexp(real_concept a, int expon)
|
||||
{ return std::ldexp(a.value(), expon); }
|
||||
inline real_concept log(real_concept a)
|
||||
{ return std::log(a.value()); }
|
||||
inline real_concept log10(real_concept a)
|
||||
{ return std::log10(a.value()); }
|
||||
inline real_concept tan(real_concept a)
|
||||
{ return std::tan(a.value()); }
|
||||
inline real_concept pow(real_concept a, real_concept b)
|
||||
{ return std::pow(a.value(), b.value()); }
|
||||
#if !defined(__SUNPRO_CC)
|
||||
inline real_concept pow(real_concept a, int b)
|
||||
{ return std::pow(a.value(), b); }
|
||||
#else
|
||||
inline real_concept pow(real_concept a, int b)
|
||||
{ return std::pow(a.value(), static_cast<real_concept_base_type>(b)); }
|
||||
#endif
|
||||
inline real_concept sin(real_concept a)
|
||||
{ return std::sin(a.value()); }
|
||||
inline real_concept sinh(real_concept a)
|
||||
{ return std::sinh(a.value()); }
|
||||
inline real_concept sqrt(real_concept a)
|
||||
{ return std::sqrt(a.value()); }
|
||||
inline real_concept tanh(real_concept a)
|
||||
{ return std::tanh(a.value()); }
|
||||
|
||||
//
|
||||
// Conversion and truncation routines:
|
||||
//
|
||||
template <class Policy>
|
||||
inline int iround(const concepts::real_concept& v, const Policy& pol)
|
||||
{ return boost::math::iround(v.value(), pol); }
|
||||
inline int iround(const concepts::real_concept& v)
|
||||
{ return boost::math::iround(v.value(), policies::policy<>()); }
|
||||
template <class Policy>
|
||||
inline long lround(const concepts::real_concept& v, const Policy& pol)
|
||||
{ return boost::math::lround(v.value(), pol); }
|
||||
inline long lround(const concepts::real_concept& v)
|
||||
{ return boost::math::lround(v.value(), policies::policy<>()); }
|
||||
|
||||
#ifdef BOOST_HAS_LONG_LONG
|
||||
template <class Policy>
|
||||
inline boost::long_long_type llround(const concepts::real_concept& v, const Policy& pol)
|
||||
{ return boost::math::llround(v.value(), pol); }
|
||||
inline boost::long_long_type llround(const concepts::real_concept& v)
|
||||
{ return boost::math::llround(v.value(), policies::policy<>()); }
|
||||
#endif
|
||||
|
||||
template <class Policy>
|
||||
inline int itrunc(const concepts::real_concept& v, const Policy& pol)
|
||||
{ return boost::math::itrunc(v.value(), pol); }
|
||||
inline int itrunc(const concepts::real_concept& v)
|
||||
{ return boost::math::itrunc(v.value(), policies::policy<>()); }
|
||||
template <class Policy>
|
||||
inline long ltrunc(const concepts::real_concept& v, const Policy& pol)
|
||||
{ return boost::math::ltrunc(v.value(), pol); }
|
||||
inline long ltrunc(const concepts::real_concept& v)
|
||||
{ return boost::math::ltrunc(v.value(), policies::policy<>()); }
|
||||
|
||||
#ifdef BOOST_HAS_LONG_LONG
|
||||
template <class Policy>
|
||||
inline boost::long_long_type lltrunc(const concepts::real_concept& v, const Policy& pol)
|
||||
{ return boost::math::lltrunc(v.value(), pol); }
|
||||
inline boost::long_long_type lltrunc(const concepts::real_concept& v)
|
||||
{ return boost::math::lltrunc(v.value(), policies::policy<>()); }
|
||||
#endif
|
||||
|
||||
// Streaming:
|
||||
template <class charT, class traits>
|
||||
inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const real_concept& a)
|
||||
{
|
||||
return os << a.value();
|
||||
}
|
||||
template <class charT, class traits>
|
||||
inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, traits>& is, real_concept& a)
|
||||
{
|
||||
#if defined(BOOST_MSVC) && defined(__SGI_STL_PORT)
|
||||
//
|
||||
// STLPort 5.1.4 has a problem reading long doubles from strings,
|
||||
// see http://sourceforge.net/tracker/index.php?func=detail&aid=1811043&group_id=146814&atid=766244
|
||||
//
|
||||
double v;
|
||||
is >> v;
|
||||
a = v;
|
||||
return is;
|
||||
#elif defined(__SGI_STL_PORT) || defined(_RWSTD_VER) || defined(__LIBCOMO__) || defined(_LIBCPP_VERSION)
|
||||
std::string s;
|
||||
real_concept_base_type d;
|
||||
is >> s;
|
||||
std::sscanf(s.c_str(), "%Lf", &d);
|
||||
a = d;
|
||||
return is;
|
||||
#else
|
||||
real_concept_base_type v;
|
||||
is >> v;
|
||||
a = v;
|
||||
return is;
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace concepts
|
||||
|
||||
namespace tools
|
||||
{
|
||||
|
||||
template <>
|
||||
inline concepts::real_concept make_big_value<concepts::real_concept>(boost::math::tools::largest_float val, const char* , mpl::false_ const&, mpl::false_ const&)
|
||||
{
|
||||
return val; // Can't use lexical_cast here, sometimes it fails....
|
||||
}
|
||||
|
||||
template <>
|
||||
inline concepts::real_concept max_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
|
||||
{
|
||||
return max_value<concepts::real_concept_base_type>();
|
||||
}
|
||||
|
||||
template <>
|
||||
inline concepts::real_concept min_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
|
||||
{
|
||||
return min_value<concepts::real_concept_base_type>();
|
||||
}
|
||||
|
||||
template <>
|
||||
inline concepts::real_concept log_max_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
|
||||
{
|
||||
return log_max_value<concepts::real_concept_base_type>();
|
||||
}
|
||||
|
||||
template <>
|
||||
inline concepts::real_concept log_min_value<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
|
||||
{
|
||||
return log_min_value<concepts::real_concept_base_type>();
|
||||
}
|
||||
|
||||
template <>
|
||||
inline concepts::real_concept epsilon<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
|
||||
{
|
||||
#ifdef __SUNPRO_CC
|
||||
return std::numeric_limits<concepts::real_concept_base_type>::epsilon();
|
||||
#else
|
||||
return tools::epsilon<concepts::real_concept_base_type>();
|
||||
#endif
|
||||
}
|
||||
|
||||
template <>
|
||||
inline BOOST_MATH_CONSTEXPR int digits<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept)) BOOST_NOEXCEPT
|
||||
{
|
||||
// Assume number of significand bits is same as real_concept_base_type,
|
||||
// unless std::numeric_limits<T>::is_specialized to provide digits.
|
||||
return tools::digits<concepts::real_concept_base_type>();
|
||||
// Note that if numeric_limits real concept is NOT specialized to provide digits10
|
||||
// (or max_digits10) then the default precision of 6 decimal digits will be used
|
||||
// by Boost test (giving misleading error messages like
|
||||
// "difference between {9.79796} and {9.79796} exceeds 5.42101e-19%"
|
||||
// and by Boost lexical cast and serialization causing loss of accuracy.
|
||||
}
|
||||
|
||||
} // namespace tools
|
||||
/*
|
||||
namespace policies {
|
||||
namespace detail {
|
||||
|
||||
template <class T>
|
||||
inline concepts::real_concept raise_rounding_error(
|
||||
const char*,
|
||||
const char*,
|
||||
const T& val,
|
||||
const concepts::real_concept&,
|
||||
const ::boost::math::policies::rounding_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
|
||||
{
|
||||
errno = ERANGE;
|
||||
// This may or may not do the right thing, but the user asked for the error
|
||||
// to be silent so here we go anyway:
|
||||
return val > 0 ? boost::math::tools::max_value<concepts::real_concept>() : -boost::math::tools::max_value<concepts::real_concept>();
|
||||
}
|
||||
|
||||
}
|
||||
}*/
|
||||
|
||||
#if defined(__SGI_STL_PORT) || defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)
|
||||
//
|
||||
// We shouldn't really need these type casts any more, but there are some
|
||||
// STLport iostream bugs we work around by using them....
|
||||
//
|
||||
namespace tools
|
||||
{
|
||||
// real_cast converts from T to integer and narrower floating-point types.
|
||||
|
||||
// Convert from T to integer types.
|
||||
|
||||
template <>
|
||||
inline unsigned int real_cast<unsigned int, concepts::real_concept>(concepts::real_concept r)
|
||||
{
|
||||
return static_cast<unsigned int>(r.value());
|
||||
}
|
||||
|
||||
template <>
|
||||
inline int real_cast<int, concepts::real_concept>(concepts::real_concept r)
|
||||
{
|
||||
return static_cast<int>(r.value());
|
||||
}
|
||||
|
||||
template <>
|
||||
inline long real_cast<long, concepts::real_concept>(concepts::real_concept r)
|
||||
{
|
||||
return static_cast<long>(r.value());
|
||||
}
|
||||
|
||||
// Converts from T to narrower floating-point types, float, double & long double.
|
||||
|
||||
template <>
|
||||
inline float real_cast<float, concepts::real_concept>(concepts::real_concept r)
|
||||
{
|
||||
return static_cast<float>(r.value());
|
||||
}
|
||||
template <>
|
||||
inline double real_cast<double, concepts::real_concept>(concepts::real_concept r)
|
||||
{
|
||||
return static_cast<double>(r.value());
|
||||
}
|
||||
template <>
|
||||
inline long double real_cast<long double, concepts::real_concept>(concepts::real_concept r)
|
||||
{
|
||||
return r.value();
|
||||
}
|
||||
|
||||
} // STLPort
|
||||
|
||||
#endif
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
|
||||
//
|
||||
// For some strange reason ADL sometimes fails to find the
|
||||
// correct overloads, unless we bring these declarations into scope:
|
||||
//
|
||||
using concepts::itrunc;
|
||||
using concepts::iround;
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace math
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_MATH_REAL_CONCEPT_HPP
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
Copyright Rene Rivera 2008-2015
|
||||
Distributed under 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)
|
||||
*/
|
||||
|
||||
#ifndef BOOST_PREDEF_OS_AIX_H
|
||||
#define BOOST_PREDEF_OS_AIX_H
|
||||
|
||||
#include <boost/predef/version_number.h>
|
||||
#include <boost/predef/make.h>
|
||||
|
||||
/*`
|
||||
[heading `BOOST_OS_AIX`]
|
||||
|
||||
[@http://en.wikipedia.org/wiki/AIX_operating_system IBM AIX] operating system.
|
||||
Version number available as major, minor, and patch.
|
||||
|
||||
[table
|
||||
[[__predef_symbol__] [__predef_version__]]
|
||||
|
||||
[[`_AIX`] [__predef_detection__]]
|
||||
[[`__TOS_AIX__`] [__predef_detection__]]
|
||||
|
||||
[[`_AIX43`] [4.3.0]]
|
||||
[[`_AIX41`] [4.1.0]]
|
||||
[[`_AIX32`] [3.2.0]]
|
||||
[[`_AIX3`] [3.0.0]]
|
||||
]
|
||||
*/
|
||||
|
||||
#define BOOST_OS_AIX BOOST_VERSION_NUMBER_NOT_AVAILABLE
|
||||
|
||||
#if !defined(BOOST_PREDEF_DETAIL_OS_DETECTED) && ( \
|
||||
defined(_AIX) || defined(__TOS_AIX__) \
|
||||
)
|
||||
# undef BOOST_OS_AIX
|
||||
# if !defined(BOOST_OS_AIX) && defined(_AIX43)
|
||||
# define BOOST_OS_AIX BOOST_VERSION_NUMBER(4,3,0)
|
||||
# endif
|
||||
# if !defined(BOOST_OS_AIX) && defined(_AIX41)
|
||||
# define BOOST_OS_AIX BOOST_VERSION_NUMBER(4,1,0)
|
||||
# endif
|
||||
# if !defined(BOOST_OS_AIX) && defined(_AIX32)
|
||||
# define BOOST_OS_AIX BOOST_VERSION_NUMBER(3,2,0)
|
||||
# endif
|
||||
# if !defined(BOOST_OS_AIX) && defined(_AIX3)
|
||||
# define BOOST_OS_AIX BOOST_VERSION_NUMBER(3,0,0)
|
||||
# endif
|
||||
# if !defined(BOOST_OS_AIX)
|
||||
# define BOOST_OS_AIX BOOST_VERSION_NUMBER_AVAILABLE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if BOOST_OS_AIX
|
||||
# define BOOST_OS_AIX_AVAILABLE
|
||||
# include <boost/predef/detail/os_detected.h>
|
||||
#endif
|
||||
|
||||
#define BOOST_OS_AIX_NAME "IBM AIX"
|
||||
|
||||
#endif
|
||||
|
||||
#include <boost/predef/detail/test.h>
|
||||
BOOST_PREDEF_DECLARE_TEST(BOOST_OS_AIX,BOOST_OS_AIX_NAME)
|
||||
@@ -0,0 +1,443 @@
|
||||
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
|
||||
// Use, modification and distribution are 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).
|
||||
//
|
||||
// See http://www.boost.org/libs/utility for most recent version including documentation.
|
||||
|
||||
// compressed_pair: pair that "compresses" empty members
|
||||
// (see libs/utility/doc/html/compressed_pair.html)
|
||||
//
|
||||
// JM changes 25 Jan 2004:
|
||||
// For the case where T1 == T2 and both are empty, then first() and second()
|
||||
// should return different objects.
|
||||
// JM changes 25 Jan 2000:
|
||||
// Removed default arguments from compressed_pair_switch to get
|
||||
// C++ Builder 4 to accept them
|
||||
// rewriten swap to get gcc and C++ builder to compile.
|
||||
// added partial specialisations for case T1 == T2 to avoid duplicate constructor defs.
|
||||
|
||||
#ifndef BOOST_DETAIL_COMPRESSED_PAIR_HPP
|
||||
#define BOOST_DETAIL_COMPRESSED_PAIR_HPP
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include <boost/type_traits/remove_cv.hpp>
|
||||
#include <boost/type_traits/is_empty.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <boost/call_traits.hpp>
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4512)
|
||||
#endif
|
||||
namespace boost
|
||||
{
|
||||
|
||||
template <class T1, class T2>
|
||||
class compressed_pair;
|
||||
|
||||
|
||||
// compressed_pair
|
||||
|
||||
namespace details
|
||||
{
|
||||
// JM altered 26 Jan 2000:
|
||||
template <class T1, class T2, bool IsSame, bool FirstEmpty, bool SecondEmpty>
|
||||
struct compressed_pair_switch;
|
||||
|
||||
template <class T1, class T2>
|
||||
struct compressed_pair_switch<T1, T2, false, false, false>
|
||||
{static const int value = 0;};
|
||||
|
||||
template <class T1, class T2>
|
||||
struct compressed_pair_switch<T1, T2, false, true, true>
|
||||
{static const int value = 3;};
|
||||
|
||||
template <class T1, class T2>
|
||||
struct compressed_pair_switch<T1, T2, false, true, false>
|
||||
{static const int value = 1;};
|
||||
|
||||
template <class T1, class T2>
|
||||
struct compressed_pair_switch<T1, T2, false, false, true>
|
||||
{static const int value = 2;};
|
||||
|
||||
template <class T1, class T2>
|
||||
struct compressed_pair_switch<T1, T2, true, true, true>
|
||||
{static const int value = 4;};
|
||||
|
||||
template <class T1, class T2>
|
||||
struct compressed_pair_switch<T1, T2, true, false, false>
|
||||
{static const int value = 5;};
|
||||
|
||||
template <class T1, class T2, int Version> class compressed_pair_imp;
|
||||
|
||||
#ifdef __GNUC__
|
||||
// workaround for GCC (JM):
|
||||
using std::swap;
|
||||
#endif
|
||||
//
|
||||
// can't call unqualified swap from within classname::swap
|
||||
// as Koenig lookup rules will find only the classname::swap
|
||||
// member function not the global declaration, so use cp_swap
|
||||
// as a forwarding function (JM):
|
||||
template <typename T>
|
||||
inline void cp_swap(T& t1, T& t2)
|
||||
{
|
||||
#ifndef __GNUC__
|
||||
using std::swap;
|
||||
#endif
|
||||
swap(t1, t2);
|
||||
}
|
||||
|
||||
// 0 derive from neither
|
||||
|
||||
template <class T1, class T2>
|
||||
class compressed_pair_imp<T1, T2, 0>
|
||||
{
|
||||
public:
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair_imp() {}
|
||||
|
||||
compressed_pair_imp(first_param_type x, second_param_type y)
|
||||
: first_(x), second_(y) {}
|
||||
|
||||
compressed_pair_imp(first_param_type x)
|
||||
: first_(x) {}
|
||||
|
||||
compressed_pair_imp(second_param_type y)
|
||||
: second_(y) {}
|
||||
|
||||
first_reference first() {return first_;}
|
||||
first_const_reference first() const {return first_;}
|
||||
|
||||
second_reference second() {return second_;}
|
||||
second_const_reference second() const {return second_;}
|
||||
|
||||
void swap(::boost::compressed_pair<T1, T2>& y)
|
||||
{
|
||||
cp_swap(first_, y.first());
|
||||
cp_swap(second_, y.second());
|
||||
}
|
||||
private:
|
||||
first_type first_;
|
||||
second_type second_;
|
||||
};
|
||||
|
||||
// 1 derive from T1
|
||||
|
||||
template <class T1, class T2>
|
||||
class compressed_pair_imp<T1, T2, 1>
|
||||
: protected ::boost::remove_cv<T1>::type
|
||||
{
|
||||
public:
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair_imp() {}
|
||||
|
||||
compressed_pair_imp(first_param_type x, second_param_type y)
|
||||
: first_type(x), second_(y) {}
|
||||
|
||||
compressed_pair_imp(first_param_type x)
|
||||
: first_type(x) {}
|
||||
|
||||
compressed_pair_imp(second_param_type y)
|
||||
: second_(y) {}
|
||||
|
||||
first_reference first() {return *this;}
|
||||
first_const_reference first() const {return *this;}
|
||||
|
||||
second_reference second() {return second_;}
|
||||
second_const_reference second() const {return second_;}
|
||||
|
||||
void swap(::boost::compressed_pair<T1,T2>& y)
|
||||
{
|
||||
// no need to swap empty base class:
|
||||
cp_swap(second_, y.second());
|
||||
}
|
||||
private:
|
||||
second_type second_;
|
||||
};
|
||||
|
||||
// 2 derive from T2
|
||||
|
||||
template <class T1, class T2>
|
||||
class compressed_pair_imp<T1, T2, 2>
|
||||
: protected ::boost::remove_cv<T2>::type
|
||||
{
|
||||
public:
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair_imp() {}
|
||||
|
||||
compressed_pair_imp(first_param_type x, second_param_type y)
|
||||
: second_type(y), first_(x) {}
|
||||
|
||||
compressed_pair_imp(first_param_type x)
|
||||
: first_(x) {}
|
||||
|
||||
compressed_pair_imp(second_param_type y)
|
||||
: second_type(y) {}
|
||||
|
||||
first_reference first() {return first_;}
|
||||
first_const_reference first() const {return first_;}
|
||||
|
||||
second_reference second() {return *this;}
|
||||
second_const_reference second() const {return *this;}
|
||||
|
||||
void swap(::boost::compressed_pair<T1,T2>& y)
|
||||
{
|
||||
// no need to swap empty base class:
|
||||
cp_swap(first_, y.first());
|
||||
}
|
||||
|
||||
private:
|
||||
first_type first_;
|
||||
};
|
||||
|
||||
// 3 derive from T1 and T2
|
||||
|
||||
template <class T1, class T2>
|
||||
class compressed_pair_imp<T1, T2, 3>
|
||||
: protected ::boost::remove_cv<T1>::type,
|
||||
protected ::boost::remove_cv<T2>::type
|
||||
{
|
||||
public:
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair_imp() {}
|
||||
|
||||
compressed_pair_imp(first_param_type x, second_param_type y)
|
||||
: first_type(x), second_type(y) {}
|
||||
|
||||
compressed_pair_imp(first_param_type x)
|
||||
: first_type(x) {}
|
||||
|
||||
compressed_pair_imp(second_param_type y)
|
||||
: second_type(y) {}
|
||||
|
||||
first_reference first() {return *this;}
|
||||
first_const_reference first() const {return *this;}
|
||||
|
||||
second_reference second() {return *this;}
|
||||
second_const_reference second() const {return *this;}
|
||||
//
|
||||
// no need to swap empty bases:
|
||||
void swap(::boost::compressed_pair<T1,T2>&) {}
|
||||
};
|
||||
|
||||
// JM
|
||||
// 4 T1 == T2, T1 and T2 both empty
|
||||
// Originally this did not store an instance of T2 at all
|
||||
// but that led to problems beause it meant &x.first() == &x.second()
|
||||
// which is not true for any other kind of pair, so now we store an instance
|
||||
// of T2 just in case the user is relying on first() and second() returning
|
||||
// different objects (albeit both empty).
|
||||
template <class T1, class T2>
|
||||
class compressed_pair_imp<T1, T2, 4>
|
||||
: protected ::boost::remove_cv<T1>::type
|
||||
{
|
||||
public:
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair_imp() {}
|
||||
|
||||
compressed_pair_imp(first_param_type x, second_param_type y)
|
||||
: first_type(x), m_second(y) {}
|
||||
|
||||
compressed_pair_imp(first_param_type x)
|
||||
: first_type(x), m_second(x) {}
|
||||
|
||||
first_reference first() {return *this;}
|
||||
first_const_reference first() const {return *this;}
|
||||
|
||||
second_reference second() {return m_second;}
|
||||
second_const_reference second() const {return m_second;}
|
||||
|
||||
void swap(::boost::compressed_pair<T1,T2>&) {}
|
||||
private:
|
||||
T2 m_second;
|
||||
};
|
||||
|
||||
// 5 T1 == T2 and are not empty: //JM
|
||||
|
||||
template <class T1, class T2>
|
||||
class compressed_pair_imp<T1, T2, 5>
|
||||
{
|
||||
public:
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair_imp() {}
|
||||
|
||||
compressed_pair_imp(first_param_type x, second_param_type y)
|
||||
: first_(x), second_(y) {}
|
||||
|
||||
compressed_pair_imp(first_param_type x)
|
||||
: first_(x), second_(x) {}
|
||||
|
||||
first_reference first() {return first_;}
|
||||
first_const_reference first() const {return first_;}
|
||||
|
||||
second_reference second() {return second_;}
|
||||
second_const_reference second() const {return second_;}
|
||||
|
||||
void swap(::boost::compressed_pair<T1, T2>& y)
|
||||
{
|
||||
cp_swap(first_, y.first());
|
||||
cp_swap(second_, y.second());
|
||||
}
|
||||
private:
|
||||
first_type first_;
|
||||
second_type second_;
|
||||
};
|
||||
|
||||
} // details
|
||||
|
||||
template <class T1, class T2>
|
||||
class compressed_pair
|
||||
: private ::boost::details::compressed_pair_imp<T1, T2,
|
||||
::boost::details::compressed_pair_switch<
|
||||
T1,
|
||||
T2,
|
||||
::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
|
||||
::boost::is_empty<T1>::value,
|
||||
::boost::is_empty<T2>::value>::value>
|
||||
{
|
||||
private:
|
||||
typedef details::compressed_pair_imp<T1, T2,
|
||||
::boost::details::compressed_pair_switch<
|
||||
T1,
|
||||
T2,
|
||||
::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
|
||||
::boost::is_empty<T1>::value,
|
||||
::boost::is_empty<T2>::value>::value> base;
|
||||
public:
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair() : base() {}
|
||||
compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
|
||||
explicit compressed_pair(first_param_type x) : base(x) {}
|
||||
explicit compressed_pair(second_param_type y) : base(y) {}
|
||||
|
||||
first_reference first() {return base::first();}
|
||||
first_const_reference first() const {return base::first();}
|
||||
|
||||
second_reference second() {return base::second();}
|
||||
second_const_reference second() const {return base::second();}
|
||||
|
||||
void swap(compressed_pair& y) { base::swap(y); }
|
||||
};
|
||||
|
||||
// JM
|
||||
// Partial specialisation for case where T1 == T2:
|
||||
//
|
||||
template <class T>
|
||||
class compressed_pair<T, T>
|
||||
: private details::compressed_pair_imp<T, T,
|
||||
::boost::details::compressed_pair_switch<
|
||||
T,
|
||||
T,
|
||||
::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
|
||||
::boost::is_empty<T>::value,
|
||||
::boost::is_empty<T>::value>::value>
|
||||
{
|
||||
private:
|
||||
typedef details::compressed_pair_imp<T, T,
|
||||
::boost::details::compressed_pair_switch<
|
||||
T,
|
||||
T,
|
||||
::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
|
||||
::boost::is_empty<T>::value,
|
||||
::boost::is_empty<T>::value>::value> base;
|
||||
public:
|
||||
typedef T first_type;
|
||||
typedef T second_type;
|
||||
typedef typename call_traits<first_type>::param_type first_param_type;
|
||||
typedef typename call_traits<second_type>::param_type second_param_type;
|
||||
typedef typename call_traits<first_type>::reference first_reference;
|
||||
typedef typename call_traits<second_type>::reference second_reference;
|
||||
typedef typename call_traits<first_type>::const_reference first_const_reference;
|
||||
typedef typename call_traits<second_type>::const_reference second_const_reference;
|
||||
|
||||
compressed_pair() : base() {}
|
||||
compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
|
||||
#if !(defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530))
|
||||
explicit
|
||||
#endif
|
||||
compressed_pair(first_param_type x) : base(x) {}
|
||||
|
||||
first_reference first() {return base::first();}
|
||||
first_const_reference first() const {return base::first();}
|
||||
|
||||
second_reference second() {return base::second();}
|
||||
second_const_reference second() const {return base::second();}
|
||||
|
||||
void swap(::boost::compressed_pair<T,T>& y) { base::swap(y); }
|
||||
};
|
||||
|
||||
template <class T1, class T2>
|
||||
inline
|
||||
void
|
||||
swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
|
||||
{
|
||||
x.swap(y);
|
||||
}
|
||||
|
||||
} // boost
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif // BOOST_DETAIL_COMPRESSED_PAIR_HPP
|
||||
|
||||
@@ -0,0 +1,589 @@
|
||||
// Boost.Range library
|
||||
//
|
||||
// Copyright Neil Groves 2010. 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)
|
||||
//
|
||||
// For more information, see http://www.boost.org/libs/range/
|
||||
//
|
||||
#ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_HPP_INCLUDED
|
||||
#define BOOST_RANGE_DETAIL_ANY_ITERATOR_HPP_INCLUDED
|
||||
|
||||
#include <boost/mpl/and.hpp>
|
||||
#include <boost/mpl/or.hpp>
|
||||
#include <boost/mpl/not.hpp>
|
||||
#include <boost/iterator/iterator_facade.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/is_reference.hpp>
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
#include <boost/range/detail/any_iterator_buffer.hpp>
|
||||
#include <boost/range/detail/any_iterator_interface.hpp>
|
||||
#include <boost/range/detail/any_iterator_wrapper.hpp>
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace range_detail
|
||||
{
|
||||
// metafunction to determine if T is a const reference
|
||||
template<class T>
|
||||
struct is_const_reference
|
||||
{
|
||||
typedef typename mpl::and_<
|
||||
typename is_reference<T>::type,
|
||||
typename is_const<
|
||||
typename remove_reference<T>::type
|
||||
>::type
|
||||
>::type type;
|
||||
};
|
||||
|
||||
// metafunction to determine if T is a mutable reference
|
||||
template<class T>
|
||||
struct is_mutable_reference
|
||||
{
|
||||
typedef typename mpl::and_<
|
||||
typename is_reference<T>::type,
|
||||
typename mpl::not_<
|
||||
typename is_const<
|
||||
typename remove_reference<T>::type
|
||||
>::type
|
||||
>::type
|
||||
>::type type;
|
||||
};
|
||||
|
||||
// metafunction to evaluate if a source 'reference' can be
|
||||
// converted to a target 'reference' as a value.
|
||||
//
|
||||
// This is true, when the target reference type is actually
|
||||
// not a reference, and the source reference is convertible
|
||||
// to the target type.
|
||||
template<class SourceReference, class TargetReference>
|
||||
struct is_convertible_to_value_as_reference
|
||||
{
|
||||
typedef typename mpl::and_<
|
||||
typename mpl::not_<
|
||||
typename is_reference<TargetReference>::type
|
||||
>::type
|
||||
, typename is_convertible<
|
||||
SourceReference
|
||||
, TargetReference
|
||||
>::type
|
||||
>::type type;
|
||||
};
|
||||
|
||||
template<
|
||||
class Value
|
||||
, class Traversal
|
||||
, class Reference
|
||||
, class Difference
|
||||
, class Buffer = any_iterator_default_buffer
|
||||
>
|
||||
class any_iterator;
|
||||
|
||||
// metafunction to determine if SomeIterator is an
|
||||
// any_iterator.
|
||||
//
|
||||
// This is the general implementation which evaluates to false.
|
||||
template<class SomeIterator>
|
||||
struct is_any_iterator
|
||||
: mpl::bool_<false>
|
||||
{
|
||||
};
|
||||
|
||||
// specialization of is_any_iterator to return true for
|
||||
// any_iterator classes regardless of template parameters.
|
||||
template<
|
||||
class Value
|
||||
, class Traversal
|
||||
, class Reference
|
||||
, class Difference
|
||||
, class Buffer
|
||||
>
|
||||
struct is_any_iterator<
|
||||
any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>
|
||||
>
|
||||
: mpl::bool_<true>
|
||||
{
|
||||
};
|
||||
} // namespace range_detail
|
||||
|
||||
namespace iterators
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
// Rationale:
|
||||
// These are specialized since the iterator_facade versions lack
|
||||
// the requisite typedefs to allow wrapping to determine the types
|
||||
// if a user copy constructs from a postfix increment.
|
||||
|
||||
template<
|
||||
class Value
|
||||
, class Traversal
|
||||
, class Reference
|
||||
, class Difference
|
||||
, class Buffer
|
||||
>
|
||||
class postfix_increment_proxy<
|
||||
range_detail::any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>
|
||||
>
|
||||
{
|
||||
typedef range_detail::any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
> any_iterator_type;
|
||||
|
||||
public:
|
||||
typedef Value value_type;
|
||||
typedef typename std::iterator_traits<any_iterator_type>::iterator_category iterator_category;
|
||||
typedef Difference difference_type;
|
||||
typedef typename iterator_pointer<any_iterator_type>::type pointer;
|
||||
typedef Reference reference;
|
||||
|
||||
explicit postfix_increment_proxy(any_iterator_type const& x)
|
||||
: stored_value(*x)
|
||||
{}
|
||||
|
||||
value_type&
|
||||
operator*() const
|
||||
{
|
||||
return this->stored_value;
|
||||
}
|
||||
private:
|
||||
mutable value_type stored_value;
|
||||
};
|
||||
|
||||
template<
|
||||
class Value
|
||||
, class Traversal
|
||||
, class Reference
|
||||
, class Difference
|
||||
, class Buffer
|
||||
>
|
||||
class writable_postfix_increment_proxy<
|
||||
range_detail::any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>
|
||||
>
|
||||
{
|
||||
typedef range_detail::any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
> any_iterator_type;
|
||||
public:
|
||||
typedef Value value_type;
|
||||
typedef typename std::iterator_traits<any_iterator_type>::iterator_category iterator_category;
|
||||
typedef Difference difference_type;
|
||||
typedef typename iterator_pointer<any_iterator_type>::type pointer;
|
||||
typedef Reference reference;
|
||||
|
||||
explicit writable_postfix_increment_proxy(any_iterator_type const& x)
|
||||
: stored_value(*x)
|
||||
, stored_iterator(x)
|
||||
{}
|
||||
|
||||
// Dereferencing must return a proxy so that both *r++ = o and
|
||||
// value_type(*r++) can work. In this case, *r is the same as
|
||||
// *r++, and the conversion operator below is used to ensure
|
||||
// readability.
|
||||
writable_postfix_increment_proxy const&
|
||||
operator*() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Provides readability of *r++
|
||||
operator value_type&() const
|
||||
{
|
||||
return stored_value;
|
||||
}
|
||||
|
||||
// Provides writability of *r++
|
||||
template <class T>
|
||||
T const& operator=(T const& x) const
|
||||
{
|
||||
*this->stored_iterator = x;
|
||||
return x;
|
||||
}
|
||||
|
||||
// This overload just in case only non-const objects are writable
|
||||
template <class T>
|
||||
T& operator=(T& x) const
|
||||
{
|
||||
*this->stored_iterator = x;
|
||||
return x;
|
||||
}
|
||||
|
||||
// Provides X(r++)
|
||||
operator any_iterator_type const&() const
|
||||
{
|
||||
return stored_iterator;
|
||||
}
|
||||
|
||||
private:
|
||||
mutable value_type stored_value;
|
||||
any_iterator_type stored_iterator;
|
||||
};
|
||||
|
||||
} //namespace detail
|
||||
} //namespace iterators
|
||||
|
||||
namespace range_detail
|
||||
{
|
||||
template<
|
||||
class Value
|
||||
, class Traversal
|
||||
, class Reference
|
||||
, class Difference
|
||||
, class Buffer
|
||||
>
|
||||
class any_iterator
|
||||
: public iterator_facade<
|
||||
any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>
|
||||
, Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
>
|
||||
{
|
||||
template<
|
||||
class OtherValue
|
||||
, class OtherTraversal
|
||||
, class OtherReference
|
||||
, class OtherDifference
|
||||
, class OtherBuffer
|
||||
>
|
||||
friend class any_iterator;
|
||||
|
||||
struct enabler {};
|
||||
struct disabler {};
|
||||
|
||||
typedef typename any_iterator_interface_type_generator<
|
||||
Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>::type abstract_base_type;
|
||||
|
||||
typedef iterator_facade<
|
||||
any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>
|
||||
, Value
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
> base_type;
|
||||
|
||||
typedef Buffer buffer_type;
|
||||
|
||||
public:
|
||||
typedef typename base_type::value_type value_type;
|
||||
typedef typename base_type::reference reference;
|
||||
typedef typename base_type::difference_type difference_type;
|
||||
|
||||
// Default constructor
|
||||
any_iterator()
|
||||
: m_impl(0) {}
|
||||
|
||||
// Simple copy construction without conversion
|
||||
any_iterator(const any_iterator& other)
|
||||
: base_type(other)
|
||||
, m_impl(other.m_impl
|
||||
? other.m_impl->clone(m_buffer)
|
||||
: 0)
|
||||
{
|
||||
}
|
||||
|
||||
// Simple assignment operator without conversion
|
||||
any_iterator& operator=(const any_iterator& other)
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
if (m_impl)
|
||||
m_impl->~abstract_base_type();
|
||||
m_buffer.deallocate();
|
||||
m_impl = 0;
|
||||
if (other.m_impl)
|
||||
m_impl = other.m_impl->clone(m_buffer);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Implicit conversion from another any_iterator where the
|
||||
// conversion is from a non-const reference to a const reference
|
||||
template<
|
||||
class OtherValue
|
||||
, class OtherTraversal
|
||||
, class OtherReference
|
||||
, class OtherDifference
|
||||
>
|
||||
any_iterator(const any_iterator<
|
||||
OtherValue,
|
||||
OtherTraversal,
|
||||
OtherReference,
|
||||
OtherDifference,
|
||||
Buffer
|
||||
>& other,
|
||||
typename ::boost::enable_if<
|
||||
typename mpl::and_<
|
||||
typename is_mutable_reference<OtherReference>::type,
|
||||
typename is_const_reference<Reference>::type
|
||||
>::type,
|
||||
enabler
|
||||
>::type* = 0
|
||||
)
|
||||
: m_impl(other.m_impl
|
||||
? other.m_impl->clone_const_ref(m_buffer)
|
||||
: 0
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
// Implicit conversion from another any_iterator where the
|
||||
// reference types of the source and the target are references
|
||||
// that are either both const, or both non-const.
|
||||
template<
|
||||
class OtherValue
|
||||
, class OtherTraversal
|
||||
, class OtherReference
|
||||
, class OtherDifference
|
||||
>
|
||||
any_iterator(const any_iterator<
|
||||
OtherValue
|
||||
, OtherTraversal
|
||||
, OtherReference
|
||||
, OtherDifference
|
||||
, Buffer
|
||||
>& other,
|
||||
typename ::boost::enable_if<
|
||||
typename mpl::or_<
|
||||
typename mpl::and_<
|
||||
typename is_mutable_reference<OtherReference>::type,
|
||||
typename is_mutable_reference<Reference>::type
|
||||
>::type,
|
||||
typename mpl::and_<
|
||||
typename is_const_reference<OtherReference>::type,
|
||||
typename is_const_reference<Reference>::type
|
||||
>::type
|
||||
>::type,
|
||||
enabler
|
||||
>::type* = 0
|
||||
)
|
||||
: m_impl(other.m_impl
|
||||
? other.m_impl->clone(m_buffer)
|
||||
: 0
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
// Implicit conversion to an any_iterator that uses a value for
|
||||
// the reference type.
|
||||
template<
|
||||
class OtherValue
|
||||
, class OtherTraversal
|
||||
, class OtherReference
|
||||
, class OtherDifference
|
||||
>
|
||||
any_iterator(const any_iterator<
|
||||
OtherValue
|
||||
, OtherTraversal
|
||||
, OtherReference
|
||||
, OtherDifference
|
||||
, Buffer
|
||||
>& other,
|
||||
typename ::boost::enable_if<
|
||||
typename is_convertible_to_value_as_reference<
|
||||
OtherReference
|
||||
, Reference
|
||||
>::type,
|
||||
enabler
|
||||
>::type* = 0
|
||||
)
|
||||
: m_impl(other.m_impl
|
||||
? other.m_impl->clone_reference_as_value(m_buffer)
|
||||
: 0
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
any_iterator clone() const
|
||||
{
|
||||
any_iterator result;
|
||||
if (m_impl)
|
||||
result.m_impl = m_impl->clone(result.m_buffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, typename abstract_base_type::const_reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>
|
||||
clone_const_ref() const
|
||||
{
|
||||
typedef any_iterator<
|
||||
Value
|
||||
, Traversal
|
||||
, typename abstract_base_type::const_reference
|
||||
, Difference
|
||||
, Buffer
|
||||
> result_type;
|
||||
|
||||
result_type result;
|
||||
|
||||
if (m_impl)
|
||||
result.m_impl = m_impl->clone_const_ref(result.m_buffer);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// implicit conversion and construction from type-erasure-compatible
|
||||
// iterators
|
||||
template<class WrappedIterator>
|
||||
explicit any_iterator(
|
||||
const WrappedIterator& wrapped_iterator,
|
||||
typename disable_if<
|
||||
typename is_any_iterator<WrappedIterator>::type
|
||||
, disabler
|
||||
>::type* = 0
|
||||
)
|
||||
{
|
||||
typedef typename any_iterator_wrapper_type_generator<
|
||||
WrappedIterator
|
||||
, Traversal
|
||||
, Reference
|
||||
, Difference
|
||||
, Buffer
|
||||
>::type wrapper_type;
|
||||
|
||||
void* ptr = m_buffer.allocate(sizeof(wrapper_type));
|
||||
m_impl = new(ptr) wrapper_type(wrapped_iterator);
|
||||
}
|
||||
|
||||
~any_iterator()
|
||||
{
|
||||
// manually run the destructor, the deallocation is automatically
|
||||
// handled by the any_iterator_small_buffer base class.
|
||||
if (m_impl)
|
||||
m_impl->~abstract_base_type();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class ::boost::iterator_core_access;
|
||||
|
||||
Reference dereference() const
|
||||
{
|
||||
BOOST_ASSERT( m_impl );
|
||||
return m_impl->dereference();
|
||||
}
|
||||
|
||||
bool equal(const any_iterator& other) const
|
||||
{
|
||||
return (m_impl == other.m_impl)
|
||||
|| (m_impl && other.m_impl && m_impl->equal(*other.m_impl));
|
||||
}
|
||||
|
||||
void increment()
|
||||
{
|
||||
BOOST_ASSERT( m_impl );
|
||||
m_impl->increment();
|
||||
}
|
||||
|
||||
void decrement()
|
||||
{
|
||||
BOOST_ASSERT( m_impl );
|
||||
m_impl->decrement();
|
||||
}
|
||||
|
||||
Difference distance_to(const any_iterator& other) const
|
||||
{
|
||||
return m_impl && other.m_impl
|
||||
? m_impl->distance_to(*other.m_impl)
|
||||
: 0;
|
||||
}
|
||||
|
||||
void advance(Difference offset)
|
||||
{
|
||||
BOOST_ASSERT( m_impl );
|
||||
m_impl->advance(offset);
|
||||
}
|
||||
|
||||
any_iterator& swap(any_iterator& other)
|
||||
{
|
||||
BOOST_ASSERT( this != &other );
|
||||
// grab a temporary copy of the other iterator
|
||||
any_iterator tmp(other);
|
||||
|
||||
// deallocate the other iterator, taking care to obey the
|
||||
// class-invariants in-case of exceptions later
|
||||
if (other.m_impl)
|
||||
{
|
||||
other.m_impl->~abstract_base_type();
|
||||
other.m_buffer.deallocate();
|
||||
other.m_impl = 0;
|
||||
}
|
||||
|
||||
// If this is a non-null iterator then we need to put
|
||||
// a clone of this iterators implementation into the other
|
||||
// iterator.
|
||||
// We can't just swap because of the small buffer optimization.
|
||||
if (m_impl)
|
||||
{
|
||||
other.m_impl = m_impl->clone(other.m_buffer);
|
||||
m_impl->~abstract_base_type();
|
||||
m_buffer.deallocate();
|
||||
m_impl = 0;
|
||||
}
|
||||
|
||||
// assign to this instance a clone of the temporarily held
|
||||
// tmp which represents the input other parameter at the
|
||||
// start of execution of this function.
|
||||
if (tmp.m_impl)
|
||||
m_impl = tmp.m_impl->clone(m_buffer);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
buffer_type m_buffer;
|
||||
abstract_base_type* m_impl;
|
||||
};
|
||||
|
||||
} // namespace range_detail
|
||||
} // namespace boost
|
||||
|
||||
#endif // include guard
|
||||
@@ -0,0 +1,50 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Example of a (2000,1000) LDPC code with 3 checks per bit and 6 bits per
|
||||
# check, tested on Additive White Gaussian Noise channels with noise standard
|
||||
# deviations varying from 0.80 to 0.95.
|
||||
#
|
||||
# Testing is done by transmitting random messages, which is safer (though
|
||||
# slower) than using only zero messages. Decoding is done using a maximum
|
||||
# of 250 iterations of probability propagation.
|
||||
|
||||
set -e # Stop if an error occurs
|
||||
set -v # Echo commands as they are read
|
||||
|
||||
make-ldpc ex-ldpc36-1000a.pchk 1000 2000 1 evenboth 3 no4cycle
|
||||
make-gen ex-ldpc36-1000a.pchk ex-ldpc36-1000a.gen dense
|
||||
rand-src ex-ldpc36-1000a.src 1 1000x100
|
||||
encode ex-ldpc36-1000a.pchk ex-ldpc36-1000a.gen ex-ldpc36-1000a.src \
|
||||
ex-ldpc36-1000a.enc
|
||||
|
||||
# NOISE STANDARD DEVIATION 0.80, Eb/N0 = 1.94 dB
|
||||
|
||||
transmit ex-ldpc36-1000a.enc ex-ldpc36-1000a.rec 1 awgn 0.80
|
||||
decode ex-ldpc36-1000a.pchk ex-ldpc36-1000a.rec ex-ldpc36-1000a.dec awgn 0.80\
|
||||
prprp 250
|
||||
verify ex-ldpc36-1000a.pchk ex-ldpc36-1000a.dec ex-ldpc36-1000a.gen \
|
||||
ex-ldpc36-1000a.src
|
||||
|
||||
# NOISE STANDARD DEVIATION 0.85, Eb/N0 = 1.41 dB
|
||||
|
||||
transmit ex-ldpc36-1000a.enc ex-ldpc36-1000a.rec 1 awgn 0.85
|
||||
decode ex-ldpc36-1000a.pchk ex-ldpc36-1000a.rec ex-ldpc36-1000a.dec awgn 0.85\
|
||||
prprp 250
|
||||
verify ex-ldpc36-1000a.pchk ex-ldpc36-1000a.dec ex-ldpc36-1000a.gen \
|
||||
ex-ldpc36-1000a.src
|
||||
|
||||
# NOISE STANDARD DEVIATION 0.90, Eb/N0 = 0.92 dB
|
||||
|
||||
transmit ex-ldpc36-1000a.enc ex-ldpc36-1000a.rec 1 awgn 0.90
|
||||
decode ex-ldpc36-1000a.pchk ex-ldpc36-1000a.rec ex-ldpc36-1000a.dec awgn 0.90\
|
||||
prprp 250
|
||||
verify ex-ldpc36-1000a.pchk ex-ldpc36-1000a.dec ex-ldpc36-1000a.gen \
|
||||
ex-ldpc36-1000a.src
|
||||
|
||||
# NOISE STANDARD DEVIATION 0.95, Eb/N0 = 0.45 dB
|
||||
|
||||
transmit ex-ldpc36-1000a.enc ex-ldpc36-1000a.rec 1 awgn 0.95
|
||||
decode ex-ldpc36-1000a.pchk ex-ldpc36-1000a.rec ex-ldpc36-1000a.dec awgn 0.95\
|
||||
prprp 250
|
||||
verify ex-ldpc36-1000a.pchk ex-ldpc36-1000a.dec ex-ldpc36-1000a.gen \
|
||||
ex-ldpc36-1000a.src
|
||||
@@ -0,0 +1,613 @@
|
||||
// (C) Copyright John Maddock 2006.
|
||||
// Use, modification and distribution are 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)
|
||||
|
||||
#ifndef BOOST_MATH_TOOLS_SOLVE_ROOT_HPP
|
||||
#define BOOST_MATH_TOOLS_SOLVE_ROOT_HPP
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <boost/math/tools/precision.hpp>
|
||||
#include <boost/math/policies/error_handling.hpp>
|
||||
#include <boost/math/tools/config.hpp>
|
||||
#include <boost/math/special_functions/sign.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <limits>
|
||||
|
||||
#ifdef BOOST_MATH_LOG_ROOT_ITERATIONS
|
||||
# define BOOST_MATH_LOGGER_INCLUDE <boost/math/tools/iteration_logger.hpp>
|
||||
# include BOOST_MATH_LOGGER_INCLUDE
|
||||
# undef BOOST_MATH_LOGGER_INCLUDE
|
||||
#else
|
||||
# define BOOST_MATH_LOG_COUNT(count)
|
||||
#endif
|
||||
|
||||
namespace boost{ namespace math{ namespace tools{
|
||||
|
||||
template <class T>
|
||||
class eps_tolerance
|
||||
{
|
||||
public:
|
||||
eps_tolerance()
|
||||
{
|
||||
eps = 4 * tools::epsilon<T>();
|
||||
}
|
||||
eps_tolerance(unsigned bits)
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
eps = (std::max)(T(ldexp(1.0F, 1-bits)), T(4 * tools::epsilon<T>()));
|
||||
}
|
||||
bool operator()(const T& a, const T& b)
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
return fabs(a - b) <= (eps * (std::min)(fabs(a), fabs(b)));
|
||||
}
|
||||
private:
|
||||
T eps;
|
||||
};
|
||||
|
||||
struct equal_floor
|
||||
{
|
||||
equal_floor(){}
|
||||
template <class T>
|
||||
bool operator()(const T& a, const T& b)
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
return floor(a) == floor(b);
|
||||
}
|
||||
};
|
||||
|
||||
struct equal_ceil
|
||||
{
|
||||
equal_ceil(){}
|
||||
template <class T>
|
||||
bool operator()(const T& a, const T& b)
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
return ceil(a) == ceil(b);
|
||||
}
|
||||
};
|
||||
|
||||
struct equal_nearest_integer
|
||||
{
|
||||
equal_nearest_integer(){}
|
||||
template <class T>
|
||||
bool operator()(const T& a, const T& b)
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
return floor(a + 0.5f) == floor(b + 0.5f);
|
||||
}
|
||||
};
|
||||
|
||||
namespace detail{
|
||||
|
||||
template <class F, class T>
|
||||
void bracket(F f, T& a, T& b, T c, T& fa, T& fb, T& d, T& fd)
|
||||
{
|
||||
//
|
||||
// Given a point c inside the existing enclosing interval
|
||||
// [a, b] sets a = c if f(c) == 0, otherwise finds the new
|
||||
// enclosing interval: either [a, c] or [c, b] and sets
|
||||
// d and fd to the point that has just been removed from
|
||||
// the interval. In other words d is the third best guess
|
||||
// to the root.
|
||||
//
|
||||
BOOST_MATH_STD_USING // For ADL of std math functions
|
||||
T tol = tools::epsilon<T>() * 2;
|
||||
//
|
||||
// If the interval [a,b] is very small, or if c is too close
|
||||
// to one end of the interval then we need to adjust the
|
||||
// location of c accordingly:
|
||||
//
|
||||
if((b - a) < 2 * tol * a)
|
||||
{
|
||||
c = a + (b - a) / 2;
|
||||
}
|
||||
else if(c <= a + fabs(a) * tol)
|
||||
{
|
||||
c = a + fabs(a) * tol;
|
||||
}
|
||||
else if(c >= b - fabs(b) * tol)
|
||||
{
|
||||
c = b - fabs(b) * tol;
|
||||
}
|
||||
//
|
||||
// OK, lets invoke f(c):
|
||||
//
|
||||
T fc = f(c);
|
||||
//
|
||||
// if we have a zero then we have an exact solution to the root:
|
||||
//
|
||||
if(fc == 0)
|
||||
{
|
||||
a = c;
|
||||
fa = 0;
|
||||
d = 0;
|
||||
fd = 0;
|
||||
return;
|
||||
}
|
||||
//
|
||||
// Non-zero fc, update the interval:
|
||||
//
|
||||
if(boost::math::sign(fa) * boost::math::sign(fc) < 0)
|
||||
{
|
||||
d = b;
|
||||
fd = fb;
|
||||
b = c;
|
||||
fb = fc;
|
||||
}
|
||||
else
|
||||
{
|
||||
d = a;
|
||||
fd = fa;
|
||||
a = c;
|
||||
fa= fc;
|
||||
}
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T safe_div(T num, T denom, T r)
|
||||
{
|
||||
//
|
||||
// return num / denom without overflow,
|
||||
// return r if overflow would occur.
|
||||
//
|
||||
BOOST_MATH_STD_USING // For ADL of std math functions
|
||||
|
||||
if(fabs(denom) < 1)
|
||||
{
|
||||
if(fabs(denom * tools::max_value<T>()) <= fabs(num))
|
||||
return r;
|
||||
}
|
||||
return num / denom;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline T secant_interpolate(const T& a, const T& b, const T& fa, const T& fb)
|
||||
{
|
||||
//
|
||||
// Performs standard secant interpolation of [a,b] given
|
||||
// function evaluations f(a) and f(b). Performs a bisection
|
||||
// if secant interpolation would leave us very close to either
|
||||
// a or b. Rationale: we only call this function when at least
|
||||
// one other form of interpolation has already failed, so we know
|
||||
// that the function is unlikely to be smooth with a root very
|
||||
// close to a or b.
|
||||
//
|
||||
BOOST_MATH_STD_USING // For ADL of std math functions
|
||||
|
||||
T tol = tools::epsilon<T>() * 5;
|
||||
T c = a - (fa / (fb - fa)) * (b - a);
|
||||
if((c <= a + fabs(a) * tol) || (c >= b - fabs(b) * tol))
|
||||
return (a + b) / 2;
|
||||
return c;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
T quadratic_interpolate(const T& a, const T& b, T const& d,
|
||||
const T& fa, const T& fb, T const& fd,
|
||||
unsigned count)
|
||||
{
|
||||
//
|
||||
// Performs quadratic interpolation to determine the next point,
|
||||
// takes count Newton steps to find the location of the
|
||||
// quadratic polynomial.
|
||||
//
|
||||
// Point d must lie outside of the interval [a,b], it is the third
|
||||
// best approximation to the root, after a and b.
|
||||
//
|
||||
// Note: this does not guarantee to find a root
|
||||
// inside [a, b], so we fall back to a secant step should
|
||||
// the result be out of range.
|
||||
//
|
||||
// Start by obtaining the coefficients of the quadratic polynomial:
|
||||
//
|
||||
T B = safe_div(T(fb - fa), T(b - a), tools::max_value<T>());
|
||||
T A = safe_div(T(fd - fb), T(d - b), tools::max_value<T>());
|
||||
A = safe_div(T(A - B), T(d - a), T(0));
|
||||
|
||||
if(A == 0)
|
||||
{
|
||||
// failure to determine coefficients, try a secant step:
|
||||
return secant_interpolate(a, b, fa, fb);
|
||||
}
|
||||
//
|
||||
// Determine the starting point of the Newton steps:
|
||||
//
|
||||
T c;
|
||||
if(boost::math::sign(A) * boost::math::sign(fa) > 0)
|
||||
{
|
||||
c = a;
|
||||
}
|
||||
else
|
||||
{
|
||||
c = b;
|
||||
}
|
||||
//
|
||||
// Take the Newton steps:
|
||||
//
|
||||
for(unsigned i = 1; i <= count; ++i)
|
||||
{
|
||||
//c -= safe_div(B * c, (B + A * (2 * c - a - b)), 1 + c - a);
|
||||
c -= safe_div(T(fa+(B+A*(c-b))*(c-a)), T(B + A * (2 * c - a - b)), T(1 + c - a));
|
||||
}
|
||||
if((c <= a) || (c >= b))
|
||||
{
|
||||
// Oops, failure, try a secant step:
|
||||
c = secant_interpolate(a, b, fa, fb);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
T cubic_interpolate(const T& a, const T& b, const T& d,
|
||||
const T& e, const T& fa, const T& fb,
|
||||
const T& fd, const T& fe)
|
||||
{
|
||||
//
|
||||
// Uses inverse cubic interpolation of f(x) at points
|
||||
// [a,b,d,e] to obtain an approximate root of f(x).
|
||||
// Points d and e lie outside the interval [a,b]
|
||||
// and are the third and forth best approximations
|
||||
// to the root that we have found so far.
|
||||
//
|
||||
// Note: this does not guarantee to find a root
|
||||
// inside [a, b], so we fall back to quadratic
|
||||
// interpolation in case of an erroneous result.
|
||||
//
|
||||
BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b
|
||||
<< " d = " << d << " e = " << e << " fa = " << fa << " fb = " << fb
|
||||
<< " fd = " << fd << " fe = " << fe);
|
||||
T q11 = (d - e) * fd / (fe - fd);
|
||||
T q21 = (b - d) * fb / (fd - fb);
|
||||
T q31 = (a - b) * fa / (fb - fa);
|
||||
T d21 = (b - d) * fd / (fd - fb);
|
||||
T d31 = (a - b) * fb / (fb - fa);
|
||||
BOOST_MATH_INSTRUMENT_CODE(
|
||||
"q11 = " << q11 << " q21 = " << q21 << " q31 = " << q31
|
||||
<< " d21 = " << d21 << " d31 = " << d31);
|
||||
T q22 = (d21 - q11) * fb / (fe - fb);
|
||||
T q32 = (d31 - q21) * fa / (fd - fa);
|
||||
T d32 = (d31 - q21) * fd / (fd - fa);
|
||||
T q33 = (d32 - q22) * fa / (fe - fa);
|
||||
T c = q31 + q32 + q33 + a;
|
||||
BOOST_MATH_INSTRUMENT_CODE(
|
||||
"q22 = " << q22 << " q32 = " << q32 << " d32 = " << d32
|
||||
<< " q33 = " << q33 << " c = " << c);
|
||||
|
||||
if((c <= a) || (c >= b))
|
||||
{
|
||||
// Out of bounds step, fall back to quadratic interpolation:
|
||||
c = quadratic_interpolate(a, b, d, fa, fb, fd, 3);
|
||||
BOOST_MATH_INSTRUMENT_CODE(
|
||||
"Out of bounds interpolation, falling back to quadratic interpolation. c = " << c);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <class F, class T, class Tol, class Policy>
|
||||
std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, const T& fax, const T& fbx, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
|
||||
{
|
||||
//
|
||||
// Main entry point and logic for Toms Algorithm 748
|
||||
// root finder.
|
||||
//
|
||||
BOOST_MATH_STD_USING // For ADL of std math functions
|
||||
|
||||
static const char* function = "boost::math::tools::toms748_solve<%1%>";
|
||||
|
||||
boost::uintmax_t count = max_iter;
|
||||
T a, b, fa, fb, c, u, fu, a0, b0, d, fd, e, fe;
|
||||
static const T mu = 0.5f;
|
||||
|
||||
// initialise a, b and fa, fb:
|
||||
a = ax;
|
||||
b = bx;
|
||||
if(a >= b)
|
||||
return boost::math::detail::pair_from_single(policies::raise_domain_error(
|
||||
function,
|
||||
"Parameters a and b out of order: a=%1%", a, pol));
|
||||
fa = fax;
|
||||
fb = fbx;
|
||||
|
||||
if(tol(a, b) || (fa == 0) || (fb == 0))
|
||||
{
|
||||
max_iter = 0;
|
||||
if(fa == 0)
|
||||
b = a;
|
||||
else if(fb == 0)
|
||||
a = b;
|
||||
return std::make_pair(a, b);
|
||||
}
|
||||
|
||||
if(boost::math::sign(fa) * boost::math::sign(fb) > 0)
|
||||
return boost::math::detail::pair_from_single(policies::raise_domain_error(
|
||||
function,
|
||||
"Parameters a and b do not bracket the root: a=%1%", a, pol));
|
||||
// dummy value for fd, e and fe:
|
||||
fe = e = fd = 1e5F;
|
||||
|
||||
if(fa != 0)
|
||||
{
|
||||
//
|
||||
// On the first step we take a secant step:
|
||||
//
|
||||
c = detail::secant_interpolate(a, b, fa, fb);
|
||||
detail::bracket(f, a, b, c, fa, fb, d, fd);
|
||||
--count;
|
||||
BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
|
||||
|
||||
if(count && (fa != 0) && !tol(a, b))
|
||||
{
|
||||
//
|
||||
// On the second step we take a quadratic interpolation:
|
||||
//
|
||||
c = detail::quadratic_interpolate(a, b, d, fa, fb, fd, 2);
|
||||
e = d;
|
||||
fe = fd;
|
||||
detail::bracket(f, a, b, c, fa, fb, d, fd);
|
||||
--count;
|
||||
BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
|
||||
}
|
||||
}
|
||||
|
||||
while(count && (fa != 0) && !tol(a, b))
|
||||
{
|
||||
// save our brackets:
|
||||
a0 = a;
|
||||
b0 = b;
|
||||
//
|
||||
// Starting with the third step taken
|
||||
// we can use either quadratic or cubic interpolation.
|
||||
// Cubic interpolation requires that all four function values
|
||||
// fa, fb, fd, and fe are distinct, should that not be the case
|
||||
// then variable prof will get set to true, and we'll end up
|
||||
// taking a quadratic step instead.
|
||||
//
|
||||
T min_diff = tools::min_value<T>() * 32;
|
||||
bool prof = (fabs(fa - fb) < min_diff) || (fabs(fa - fd) < min_diff) || (fabs(fa - fe) < min_diff) || (fabs(fb - fd) < min_diff) || (fabs(fb - fe) < min_diff) || (fabs(fd - fe) < min_diff);
|
||||
if(prof)
|
||||
{
|
||||
c = detail::quadratic_interpolate(a, b, d, fa, fb, fd, 2);
|
||||
BOOST_MATH_INSTRUMENT_CODE("Can't take cubic step!!!!");
|
||||
}
|
||||
else
|
||||
{
|
||||
c = detail::cubic_interpolate(a, b, d, e, fa, fb, fd, fe);
|
||||
}
|
||||
//
|
||||
// re-bracket, and check for termination:
|
||||
//
|
||||
e = d;
|
||||
fe = fd;
|
||||
detail::bracket(f, a, b, c, fa, fb, d, fd);
|
||||
if((0 == --count) || (fa == 0) || tol(a, b))
|
||||
break;
|
||||
BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
|
||||
//
|
||||
// Now another interpolated step:
|
||||
//
|
||||
prof = (fabs(fa - fb) < min_diff) || (fabs(fa - fd) < min_diff) || (fabs(fa - fe) < min_diff) || (fabs(fb - fd) < min_diff) || (fabs(fb - fe) < min_diff) || (fabs(fd - fe) < min_diff);
|
||||
if(prof)
|
||||
{
|
||||
c = detail::quadratic_interpolate(a, b, d, fa, fb, fd, 3);
|
||||
BOOST_MATH_INSTRUMENT_CODE("Can't take cubic step!!!!");
|
||||
}
|
||||
else
|
||||
{
|
||||
c = detail::cubic_interpolate(a, b, d, e, fa, fb, fd, fe);
|
||||
}
|
||||
//
|
||||
// Bracket again, and check termination condition, update e:
|
||||
//
|
||||
detail::bracket(f, a, b, c, fa, fb, d, fd);
|
||||
if((0 == --count) || (fa == 0) || tol(a, b))
|
||||
break;
|
||||
BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
|
||||
//
|
||||
// Now we take a double-length secant step:
|
||||
//
|
||||
if(fabs(fa) < fabs(fb))
|
||||
{
|
||||
u = a;
|
||||
fu = fa;
|
||||
}
|
||||
else
|
||||
{
|
||||
u = b;
|
||||
fu = fb;
|
||||
}
|
||||
c = u - 2 * (fu / (fb - fa)) * (b - a);
|
||||
if(fabs(c - u) > (b - a) / 2)
|
||||
{
|
||||
c = a + (b - a) / 2;
|
||||
}
|
||||
//
|
||||
// Bracket again, and check termination condition:
|
||||
//
|
||||
e = d;
|
||||
fe = fd;
|
||||
detail::bracket(f, a, b, c, fa, fb, d, fd);
|
||||
BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
|
||||
BOOST_MATH_INSTRUMENT_CODE(" tol = " << T((fabs(a) - fabs(b)) / fabs(a)));
|
||||
if((0 == --count) || (fa == 0) || tol(a, b))
|
||||
break;
|
||||
//
|
||||
// And finally... check to see if an additional bisection step is
|
||||
// to be taken, we do this if we're not converging fast enough:
|
||||
//
|
||||
if((b - a) < mu * (b0 - a0))
|
||||
continue;
|
||||
//
|
||||
// bracket again on a bisection:
|
||||
//
|
||||
e = d;
|
||||
fe = fd;
|
||||
detail::bracket(f, a, b, T(a + (b - a) / 2), fa, fb, d, fd);
|
||||
--count;
|
||||
BOOST_MATH_INSTRUMENT_CODE("Not converging: Taking a bisection!!!!");
|
||||
BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
|
||||
} // while loop
|
||||
|
||||
max_iter -= count;
|
||||
if(fa == 0)
|
||||
{
|
||||
b = a;
|
||||
}
|
||||
else if(fb == 0)
|
||||
{
|
||||
a = b;
|
||||
}
|
||||
BOOST_MATH_LOG_COUNT(max_iter)
|
||||
return std::make_pair(a, b);
|
||||
}
|
||||
|
||||
template <class F, class T, class Tol>
|
||||
inline std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, const T& fax, const T& fbx, Tol tol, boost::uintmax_t& max_iter)
|
||||
{
|
||||
return toms748_solve(f, ax, bx, fax, fbx, tol, max_iter, policies::policy<>());
|
||||
}
|
||||
|
||||
template <class F, class T, class Tol, class Policy>
|
||||
inline std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
|
||||
{
|
||||
max_iter -= 2;
|
||||
std::pair<T, T> r = toms748_solve(f, ax, bx, f(ax), f(bx), tol, max_iter, pol);
|
||||
max_iter += 2;
|
||||
return r;
|
||||
}
|
||||
|
||||
template <class F, class T, class Tol>
|
||||
inline std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, Tol tol, boost::uintmax_t& max_iter)
|
||||
{
|
||||
return toms748_solve(f, ax, bx, tol, max_iter, policies::policy<>());
|
||||
}
|
||||
|
||||
template <class F, class T, class Tol, class Policy>
|
||||
std::pair<T, T> bracket_and_solve_root(F f, const T& guess, T factor, bool rising, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
|
||||
{
|
||||
BOOST_MATH_STD_USING
|
||||
static const char* function = "boost::math::tools::bracket_and_solve_root<%1%>";
|
||||
//
|
||||
// Set up inital brackets:
|
||||
//
|
||||
T a = guess;
|
||||
T b = a;
|
||||
T fa = f(a);
|
||||
T fb = fa;
|
||||
//
|
||||
// Set up invocation count:
|
||||
//
|
||||
boost::uintmax_t count = max_iter - 1;
|
||||
|
||||
int step = 32;
|
||||
|
||||
if((fa < 0) == (guess < 0 ? !rising : rising))
|
||||
{
|
||||
//
|
||||
// Zero is to the right of b, so walk upwards
|
||||
// until we find it:
|
||||
//
|
||||
while((boost::math::sign)(fb) == (boost::math::sign)(fa))
|
||||
{
|
||||
if(count == 0)
|
||||
return boost::math::detail::pair_from_single(policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", b, pol));
|
||||
//
|
||||
// Heuristic: normally it's best not to increase the step sizes as we'll just end up
|
||||
// with a really wide range to search for the root. However, if the initial guess was *really*
|
||||
// bad then we need to speed up the search otherwise we'll take forever if we're orders of
|
||||
// magnitude out. This happens most often if the guess is a small value (say 1) and the result
|
||||
// we're looking for is close to std::numeric_limits<T>::min().
|
||||
//
|
||||
if((max_iter - count) % step == 0)
|
||||
{
|
||||
factor *= 2;
|
||||
if(step > 1) step /= 2;
|
||||
}
|
||||
//
|
||||
// Now go ahead and move our guess by "factor":
|
||||
//
|
||||
a = b;
|
||||
fa = fb;
|
||||
b *= factor;
|
||||
fb = f(b);
|
||||
--count;
|
||||
BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Zero is to the left of a, so walk downwards
|
||||
// until we find it:
|
||||
//
|
||||
while((boost::math::sign)(fb) == (boost::math::sign)(fa))
|
||||
{
|
||||
if(fabs(a) < tools::min_value<T>())
|
||||
{
|
||||
// Escape route just in case the answer is zero!
|
||||
max_iter -= count;
|
||||
max_iter += 1;
|
||||
return a > 0 ? std::make_pair(T(0), T(a)) : std::make_pair(T(a), T(0));
|
||||
}
|
||||
if(count == 0)
|
||||
return boost::math::detail::pair_from_single(policies::raise_evaluation_error(function, "Unable to bracket root, last nearest value was %1%", a, pol));
|
||||
//
|
||||
// Heuristic: normally it's best not to increase the step sizes as we'll just end up
|
||||
// with a really wide range to search for the root. However, if the initial guess was *really*
|
||||
// bad then we need to speed up the search otherwise we'll take forever if we're orders of
|
||||
// magnitude out. This happens most often if the guess is a small value (say 1) and the result
|
||||
// we're looking for is close to std::numeric_limits<T>::min().
|
||||
//
|
||||
if((max_iter - count) % step == 0)
|
||||
{
|
||||
factor *= 2;
|
||||
if(step > 1) step /= 2;
|
||||
}
|
||||
//
|
||||
// Now go ahead and move are guess by "factor":
|
||||
//
|
||||
b = a;
|
||||
fb = fa;
|
||||
a /= factor;
|
||||
fa = f(a);
|
||||
--count;
|
||||
BOOST_MATH_INSTRUMENT_CODE("a = " << a << " b = " << b << " fa = " << fa << " fb = " << fb << " count = " << count);
|
||||
}
|
||||
}
|
||||
max_iter -= count;
|
||||
max_iter += 1;
|
||||
std::pair<T, T> r = toms748_solve(
|
||||
f,
|
||||
(a < 0 ? b : a),
|
||||
(a < 0 ? a : b),
|
||||
(a < 0 ? fb : fa),
|
||||
(a < 0 ? fa : fb),
|
||||
tol,
|
||||
count,
|
||||
pol);
|
||||
max_iter += count;
|
||||
BOOST_MATH_INSTRUMENT_CODE("max_iter = " << max_iter << " count = " << count);
|
||||
BOOST_MATH_LOG_COUNT(max_iter)
|
||||
return r;
|
||||
}
|
||||
|
||||
template <class F, class T, class Tol>
|
||||
inline std::pair<T, T> bracket_and_solve_root(F f, const T& guess, const T& factor, bool rising, Tol tol, boost::uintmax_t& max_iter)
|
||||
{
|
||||
return bracket_and_solve_root(f, guess, factor, rising, tol, max_iter, policies::policy<>());
|
||||
}
|
||||
|
||||
} // namespace tools
|
||||
} // namespace math
|
||||
} // namespace boost
|
||||
|
||||
|
||||
#endif // BOOST_MATH_TOOLS_SOLVE_ROOT_HPP
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
// Copyright 2008 John Maddock
|
||||
//
|
||||
// Use, modification and distribution are 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)
|
||||
|
||||
#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_CDF_HPP
|
||||
#define BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_CDF_HPP
|
||||
|
||||
#include <boost/math/policies/error_handling.hpp>
|
||||
#include <boost/math/distributions/detail/hypergeometric_pdf.hpp>
|
||||
|
||||
namespace boost{ namespace math{ namespace detail{
|
||||
|
||||
template <class T, class Policy>
|
||||
T hypergeometric_cdf_imp(unsigned x, unsigned r, unsigned n, unsigned N, bool invert, const Policy& pol)
|
||||
{
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4267)
|
||||
#endif
|
||||
BOOST_MATH_STD_USING
|
||||
T result = 0;
|
||||
T mode = floor(T(r + 1) * T(n + 1) / (N + 2));
|
||||
if(x < mode)
|
||||
{
|
||||
result = hypergeometric_pdf<T>(x, r, n, N, pol);
|
||||
T diff = result;
|
||||
unsigned lower_limit = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
|
||||
while(diff > (invert ? T(1) : result) * tools::epsilon<T>())
|
||||
{
|
||||
diff = T(x) * T((N + x) - n - r) * diff / (T(1 + n - x) * T(1 + r - x));
|
||||
result += diff;
|
||||
BOOST_MATH_INSTRUMENT_VARIABLE(x);
|
||||
BOOST_MATH_INSTRUMENT_VARIABLE(diff);
|
||||
BOOST_MATH_INSTRUMENT_VARIABLE(result);
|
||||
if(x == lower_limit)
|
||||
break;
|
||||
--x;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
invert = !invert;
|
||||
unsigned upper_limit = (std::min)(r, n);
|
||||
if(x != upper_limit)
|
||||
{
|
||||
++x;
|
||||
result = hypergeometric_pdf<T>(x, r, n, N, pol);
|
||||
T diff = result;
|
||||
while((x <= upper_limit) && (diff > (invert ? T(1) : result) * tools::epsilon<T>()))
|
||||
{
|
||||
diff = T(n - x) * T(r - x) * diff / (T(x + 1) * T((N + x + 1) - n - r));
|
||||
result += diff;
|
||||
++x;
|
||||
BOOST_MATH_INSTRUMENT_VARIABLE(x);
|
||||
BOOST_MATH_INSTRUMENT_VARIABLE(diff);
|
||||
BOOST_MATH_INSTRUMENT_VARIABLE(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(invert)
|
||||
result = 1 - result;
|
||||
return result;
|
||||
#ifdef BOOST_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class T, class Policy>
|
||||
inline T hypergeometric_cdf(unsigned x, unsigned r, unsigned n, unsigned N, bool invert, const Policy&)
|
||||
{
|
||||
BOOST_FPU_EXCEPTION_GUARD
|
||||
typedef typename tools::promote_args<T>::type result_type;
|
||||
typedef typename policies::evaluation<result_type, Policy>::type value_type;
|
||||
typedef typename policies::normalise<
|
||||
Policy,
|
||||
policies::promote_float<false>,
|
||||
policies::promote_double<false>,
|
||||
policies::discrete_quantile<>,
|
||||
policies::assert_undefined<> >::type forwarding_policy;
|
||||
|
||||
value_type result;
|
||||
result = detail::hypergeometric_cdf_imp<value_type>(x, r, n, N, invert, forwarding_policy());
|
||||
if(result > 1)
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
if(result < 0)
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
return policies::checked_narrowing_cast<result_type, forwarding_policy>(result, "boost::math::hypergeometric_cdf<%1%>(%1%,%1%,%1%,%1%)");
|
||||
}
|
||||
|
||||
}}} // namespaces
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under 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)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_SUPPORT_VOID_20070706_2125)
|
||||
#define BOOST_FUSION_SUPPORT_VOID_20070706_2125
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
struct void_ {};
|
||||
}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,58 @@
|
||||
// boost/filesystem/convenience.hpp ----------------------------------------//
|
||||
|
||||
// Copyright Beman Dawes, 2002-2005
|
||||
// Copyright Vladimir Prus, 2002
|
||||
// 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)
|
||||
|
||||
// See library home page at http://www.boost.org/libs/filesystem
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
||||
#ifndef BOOST_FILESYSTEM3_CONVENIENCE_HPP
|
||||
#define BOOST_FILESYSTEM3_CONVENIENCE_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
# if defined( BOOST_NO_STD_WSTRING )
|
||||
# error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
|
||||
# endif
|
||||
|
||||
#include <boost/filesystem/operations.hpp>
|
||||
#include <boost/system/error_code.hpp>
|
||||
|
||||
#include <boost/config/abi_prefix.hpp> // must be the last #include
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace filesystem
|
||||
{
|
||||
|
||||
# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
|
||||
|
||||
inline std::string extension(const path & p)
|
||||
{
|
||||
return p.extension().string();
|
||||
}
|
||||
|
||||
inline std::string basename(const path & p)
|
||||
{
|
||||
return p.stem().string();
|
||||
}
|
||||
|
||||
inline path change_extension( const path & p, const path & new_extension )
|
||||
{
|
||||
path new_p( p );
|
||||
new_p.replace_extension( new_extension );
|
||||
return new_p;
|
||||
}
|
||||
|
||||
# endif
|
||||
|
||||
|
||||
} // namespace filesystem
|
||||
} // namespace boost
|
||||
|
||||
#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
|
||||
#endif // BOOST_FILESYSTEM3_CONVENIENCE_HPP
|
||||
@@ -0,0 +1,100 @@
|
||||
// boost polymorphic_cast.hpp header file ----------------------------------------------//
|
||||
|
||||
// (C) Copyright Kevlin Henney and Dave Abrahams 1999.
|
||||
// (C) Copyright Boris Rasin 2014.
|
||||
// Distributed under 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)
|
||||
|
||||
// See http://www.boost.org/libs/conversion for Documentation.
|
||||
|
||||
// Revision History
|
||||
// 10 Nov 14 polymorphic_pointer_downcast moved to a separate header,
|
||||
// minor improvements to stisfy latest Boost coding style
|
||||
// 08 Nov 14 Add polymorphic_pointer_downcast (Boris Rasin)
|
||||
// 09 Jun 14 "cast.hpp" was renamed to "polymorphic_cast.hpp" and
|
||||
// inclusion of numeric_cast was removed (Antony Polukhin)
|
||||
// 23 Jun 05 numeric_cast removed and redirected to the new verion (Fernando Cacciola)
|
||||
// 02 Apr 01 Removed BOOST_NO_LIMITS workarounds and included
|
||||
// <boost/limits.hpp> instead (the workaround did not
|
||||
// actually compile when BOOST_NO_LIMITS was defined in
|
||||
// any case, so we loose nothing). (John Maddock)
|
||||
// 21 Jan 01 Undid a bug I introduced yesterday. numeric_cast<> never
|
||||
// worked with stock GCC; trying to get it to do that broke
|
||||
// vc-stlport.
|
||||
// 20 Jan 01 Moved BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS to config.hpp.
|
||||
// Removed unused BOOST_EXPLICIT_TARGET macro. Moved
|
||||
// boost::detail::type to boost/type.hpp. Made it compile with
|
||||
// stock gcc again (Dave Abrahams)
|
||||
// 29 Nov 00 Remove nested namespace cast, cleanup spacing before Formal
|
||||
// Review (Beman Dawes)
|
||||
// 19 Oct 00 Fix numeric_cast for floating-point types (Dave Abrahams)
|
||||
// 15 Jul 00 Suppress numeric_cast warnings for GCC, Borland and MSVC
|
||||
// (Dave Abrahams)
|
||||
// 30 Jun 00 More MSVC6 wordarounds. See comments below. (Dave Abrahams)
|
||||
// 28 Jun 00 Removed implicit_cast<>. See comment below. (Beman Dawes)
|
||||
// 27 Jun 00 More MSVC6 workarounds
|
||||
// 15 Jun 00 Add workarounds for MSVC6
|
||||
// 2 Feb 00 Remove bad_numeric_cast ";" syntax error (Doncho Angelov)
|
||||
// 26 Jan 00 Add missing throw() to bad_numeric_cast::what(0 (Adam Levar)
|
||||
// 29 Dec 99 Change using declarations so usages in other namespaces work
|
||||
// correctly (Dave Abrahams)
|
||||
// 23 Sep 99 Change polymorphic_downcast assert to also detect M.I. errors
|
||||
// as suggested Darin Adler and improved by Valentin Bonnard.
|
||||
// 2 Sep 99 Remove controversial asserts, simplify, rename.
|
||||
// 30 Aug 99 Move to cast.hpp, replace value_cast with numeric_cast,
|
||||
// place in nested namespace.
|
||||
// 3 Aug 99 Initial version
|
||||
|
||||
#ifndef BOOST_POLYMORPHIC_CAST_HPP
|
||||
#define BOOST_POLYMORPHIC_CAST_HPP
|
||||
|
||||
# include <boost/config.hpp>
|
||||
# include <boost/assert.hpp>
|
||||
# include <boost/throw_exception.hpp>
|
||||
# include <typeinfo>
|
||||
|
||||
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||
# pragma once
|
||||
#endif
|
||||
|
||||
namespace boost
|
||||
{
|
||||
// See the documentation for descriptions of how to choose between
|
||||
// static_cast<>, dynamic_cast<>, polymorphic_cast<> and polymorphic_downcast<>
|
||||
|
||||
// polymorphic_cast --------------------------------------------------------//
|
||||
|
||||
// Runtime checked polymorphic downcasts and crosscasts.
|
||||
// Suggested in The C++ Programming Language, 3rd Ed, Bjarne Stroustrup,
|
||||
// section 15.8 exercise 1, page 425.
|
||||
|
||||
template <class Target, class Source>
|
||||
inline Target polymorphic_cast(Source* x)
|
||||
{
|
||||
Target tmp = dynamic_cast<Target>(x);
|
||||
if ( tmp == 0 ) boost::throw_exception( std::bad_cast() );
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// polymorphic_downcast ----------------------------------------------------//
|
||||
|
||||
// BOOST_ASSERT() checked polymorphic downcast. Crosscasts prohibited.
|
||||
|
||||
// WARNING: Because this cast uses BOOST_ASSERT(), it violates
|
||||
// the One Definition Rule if used in multiple translation units
|
||||
// where BOOST_DISABLE_ASSERTS, BOOST_ENABLE_ASSERT_HANDLER
|
||||
// NDEBUG are defined inconsistently.
|
||||
|
||||
// Contributed by Dave Abrahams
|
||||
|
||||
template <class Target, class Source>
|
||||
inline Target polymorphic_downcast(Source* x)
|
||||
{
|
||||
BOOST_ASSERT( dynamic_cast<Target>(x) == x ); // detect logic error
|
||||
return static_cast<Target>(x);
|
||||
}
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif // BOOST_POLYMORPHIC_CAST_HPP
|
||||
Reference in New Issue
Block a user