diff --git a/include/boost/mpl/aux_/joint_iter.hpp b/include/boost/mpl/aux_/joint_iter.hpp new file mode 100644 index 0000000..6c7d6d0 --- /dev/null +++ b/include/boost/mpl/aux_/joint_iter.hpp @@ -0,0 +1,141 @@ +//----------------------------------------------------------------------------- +// boost mpl/aux_/joint_iter.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2000-02 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED +#define BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED + +#include "boost/mpl/aux_/lambda_spec.hpp" +#include "boost/mpl/aux_/config/ctps.hpp" +#include "boost/type_traits/is_same.hpp" + +namespace boost { +namespace mpl { +namespace aux { + +#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) + +template< + typename Iterator1 + , typename LastIterator1 + , typename Iterator2 + > +struct joint_iter +{ + typedef Iterator1 base; + typedef typename base::category category; + typedef joint_iter< + typename base::next + , LastIterator1 + , Iterator2 + > next; + + typedef typename base::type type; +}; + +template< + typename LastIterator1 + , typename Iterator2 + > +struct joint_iter +{ + typedef Iterator2 base; + typedef typename base::category category; + typedef joint_iter< + LastIterator1 + , LastIterator1 + , typename base::next + > next; + + typedef typename base::type type; +}; + + +#else + +// forward decl. for 'joint_iter_impl' +template< + typename Iterator1 + , typename LastIterator1 + , typename Iterator2 + > +struct joint_iter; + +template< bool > struct joint_iter_impl +{ + template< + typename Iterator1 + , typename LastIterator1 + , typename Iterator2 + > + struct result_ + { + typedef Iterator1 base; + // agurt, 16/nov/02: have to use 'Iterator1' instead of 'base' below + // to prevent 'base' and 'mpl::base' conflict on MSVC 6.0 + typedef typename Iterator1::category category; + typedef joint_iter< + typename Iterator1::next + , LastIterator1 + , Iterator2 + > next; + + typedef typename Iterator1::type type; + }; +}; + +template<> struct joint_iter_impl +{ + template< + typename Iterator1 + , typename LastIterator1 + , typename Iterator2 + > + struct result_ + { + typedef Iterator2 base; + typedef typename Iterator2::category category; + typedef joint_iter< + LastIterator1 + , LastIterator1 + , typename Iterator2::next + > next; + + typedef typename Iterator2::type type; + }; +}; + + +template< + typename Iterator1 + , typename LastIterator1 + , typename Iterator2 + > +struct joint_iter + : joint_iter_impl< is_same::value > + ::template result_ +{ +}; + +#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +} // namespace aux + +BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(3, aux::joint_iter) + +} // namespace mpl +} // namespace boost + +#endif // BOOST_MPL_AUX_JOINT_ITER_HPP_INCLUDED diff --git a/include/boost/mpl/joint_view.hpp b/include/boost/mpl/joint_view.hpp new file mode 100644 index 0000000..1f8d2ed --- /dev/null +++ b/include/boost/mpl/joint_view.hpp @@ -0,0 +1,50 @@ +//----------------------------------------------------------------------------- +// boost mpl/joint_view.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2000-02 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_JOINT_VIEW_HPP_INCLUDED +#define BOOST_MPL_JOINT_VIEW_HPP_INCLUDED + +#include "boost/mpl/aux_/joint_iter.hpp" +#include "boost/mpl/begin_end.hpp" +#include "boost/mpl/aux_/void_spec.hpp" + +namespace boost { +namespace mpl { + +template< + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Sequence1_) + , typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Sequence2_) + > +struct joint_view +{ + private: + typedef typename begin::type first1_; + typedef typename end::type last1_; + typedef typename begin::type first2_; + typedef typename end::type last2_; + + public: + struct tag; + typedef typename aux::joint_iter begin; + typedef typename aux::joint_iter end; +}; + +BOOST_MPL_AUX_VOID_SPEC(2, joint_view) + +} // namespace mpl +} // namespace boost + +#endif // BOOST_MPL_JOINT_VIEW_HPP_INCLUDED diff --git a/test/joint_view.cpp b/test/joint_view.cpp new file mode 100644 index 0000000..ce580f5 --- /dev/null +++ b/test/joint_view.cpp @@ -0,0 +1,35 @@ +//----------------------------------------------------------------------------- +// boost mpl/test/joint_view.cpp source file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2001-02 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#include "boost/mpl/joint_view.hpp" +#include "boost/mpl/range_c.hpp" +#include "boost/mpl/equal.hpp" +#include "boost/static_assert.hpp" + +namespace mpl = boost::mpl; + +int main() +{ + typedef mpl::joint_view< + mpl::range_c + , mpl::range_c + > numbers; + + typedef mpl::range_c answer; + BOOST_STATIC_ASSERT((mpl::equal::type::value)); + + return 0; +}