mirror of
https://github.com/boostorg/utility.git
synced 2025-05-09 15:04:00 +00:00
Boost.Python. The major change is that, instead of being boost::function2<PyObject*,PyObject*,PyObject*>, py_function is now a runtime-polymorphic wrapper for compile-time polymorphic behavior (just like function) of our own which carries more information/behaviors. In particular, you can retrieve an array of c-strings describing the types in the function signature. Additionally, the minimum and maximum arity are stored in the py_function object instead of in the 'function' object which wraps it. * data_members.hpp - Adjustments for the new py_function. Workarounds for CodeWarrior Pro 8.3 bugs in function template argument deduction with pointers-to-members. * has_back_reference.hpp, test/back_reference.cpp, test/select_holder.cpp - Updated to follow the metafunction protocol * init.hpp, detail/defaults_gen.hpp - Make Keywords a more-specific type in function signatures to prevent string literals that show up as char[N] from binding to the wrong argument (at least Intel 7.1 for Windows does this). * make_function.hpp - Adjustments for the new py_function. Arities are now computed by caller<>. * opaque_pointer_converter.hpp, type_id.hpp - Use BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS facilities; generate specializations that all compilers can handle. * raw_function.hpp - Adjustments for the new py_function. * caller.hpp - Added arity and signature type name reporting. * detail/config.hpp Enable __declspec(dllexport) for Cygwin, thereby fixing the recent horrible Cygwin linking problems. * detail/msvc_typeinfo.hpp - Always pass boost::type<T>* explicitly, thereby working around incompatible notions of how to specialize function templates with default arguments on various compilers. * object/function.hpp , object/function_handle.hpp , object/function_object.hpp , object/function_object.cpp Adjustments for the new py_function. Arities are carried by py_function. * object/iterator.hpp, object/iterator.cpp Adjustments for the new py_function; we have to compute a signature of types to construct it with. * object/py_function.hpp Removed dependency on boost::function; see the comment at the top of this entry for more details. * object/select_holder.hpp Clean up to more closely follow MPL idioms. * test/Jamfile - Adjust the embedding test for the new Cygwin use of declspec. Update bases and pointee tests with missing properties. * test/input_iterator.cpp - Updates for the new iterator adaptors. * test/opaque.py - Add Python encoding comment to suppress PendinDeprecationWarning with recent Python builds. * test/str.cpp Pass a Python long instead of a float to string.expandtabs, suppressing a PendinDeprecationWarning with recent Python builds. * libs/utility/counting_iterator_example.cpp Borland workaround * libs/utility/indirect_iterator_example.cpp const-correctness fix. * [SVN r19247]
97 lines
2.7 KiB
C++
97 lines
2.7 KiB
C++
// (C) Copyright Jeremy Siek 2000. Permission to copy, use, modify, sell and
|
|
// distribute this software is granted provided this copyright notice appears
|
|
// in all copies. This software is provided "as is" without express or implied
|
|
// warranty, and with no claim as to its suitability for any purpose.
|
|
|
|
#include <boost/config.hpp>
|
|
#include <vector>
|
|
#include <iostream>
|
|
#include <iterator>
|
|
#include <functional>
|
|
#include <algorithm>
|
|
#include <boost/iterator/indirect_iterator.hpp>
|
|
|
|
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
namespace boost { namespace detail
|
|
{
|
|
template <>
|
|
struct iterator_traits<char*>
|
|
: ptr_iter_traits<char>
|
|
{
|
|
};
|
|
|
|
template <>
|
|
struct iterator_traits<char const*>
|
|
: ptr_iter_traits<char, char const>
|
|
{
|
|
};
|
|
|
|
template <>
|
|
struct iterator_traits<char**>
|
|
: ptr_iter_traits<char*>
|
|
{
|
|
};
|
|
|
|
template <>
|
|
struct iterator_traits<char const* const*>
|
|
: ptr_iter_traits<char const*, char const* const>
|
|
{
|
|
};
|
|
|
|
template <>
|
|
struct iterator_traits<char* const*>
|
|
: ptr_iter_traits<char*, char* const>
|
|
{
|
|
};
|
|
}}
|
|
#endif
|
|
|
|
int main(int, char*[])
|
|
{
|
|
char characters[] = "abcdefg";
|
|
const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char
|
|
char* pointers_to_chars[N]; // at the end.
|
|
for (int i = 0; i < N; ++i)
|
|
pointers_to_chars[i] = &characters[i];
|
|
|
|
// Example of using indirect_iterator_generator
|
|
|
|
boost::indirect_iterator<char**, char>
|
|
indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N);
|
|
|
|
std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ","));
|
|
std::cout << std::endl;
|
|
|
|
|
|
// Example of using indirect_iterator_pair_generator
|
|
|
|
char mutable_characters[N];
|
|
char* pointers_to_mutable_chars[N];
|
|
for (int j = 0; j < N; ++j)
|
|
pointers_to_mutable_chars[j] = &mutable_characters[j];
|
|
|
|
boost::indirect_iterator<char* const*> mutable_indirect_first(pointers_to_mutable_chars),
|
|
mutable_indirect_last(pointers_to_mutable_chars + N);
|
|
boost::indirect_iterator<char* const*, char const> const_indirect_first(pointers_to_chars),
|
|
const_indirect_last(pointers_to_chars + N);
|
|
|
|
std::transform(const_indirect_first, const_indirect_last,
|
|
mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
|
|
|
|
std::copy(mutable_indirect_first, mutable_indirect_last,
|
|
std::ostream_iterator<char>(std::cout, ","));
|
|
std::cout << std::endl;
|
|
|
|
|
|
// Example of using make_indirect_iterator()
|
|
|
|
#if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
|
|
std::copy(boost::make_indirect_iterator(pointers_to_chars),
|
|
boost::make_indirect_iterator(pointers_to_chars + N),
|
|
std::ostream_iterator<char>(std::cout, ","));
|
|
std::cout << std::endl;
|
|
#endif
|
|
|
|
return 0;
|
|
}
|