imgtools/imglib/boostlibrary/boost/mpl/upper_bound.hpp
changeset 2 39c28ec933dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/mpl/upper_bound.hpp	Mon May 10 19:54:49 2010 +0100
@@ -0,0 +1,141 @@
+
+#ifndef BOOST_MPL_UPPER_BOUND_HPP_INCLUDED
+#define BOOST_MPL_UPPER_BOUND_HPP_INCLUDED
+
+// Copyright Aleksey Gurtovoy 2001-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: upper_bound.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
+// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
+// $Revision: 49267 $
+
+#include <boost/mpl/less.hpp>
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/aux_/na_spec.hpp>
+#include <boost/mpl/aux_/config/workaround.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
+#   define BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL
+#endif
+
+#if !defined(BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL)
+#   include <boost/mpl/minus.hpp>
+#   include <boost/mpl/divides.hpp>
+#   include <boost/mpl/size.hpp>
+#   include <boost/mpl/advance.hpp>
+#   include <boost/mpl/begin_end.hpp>
+#   include <boost/mpl/long.hpp>
+#   include <boost/mpl/eval_if.hpp>
+#   include <boost/mpl/prior.hpp>
+#   include <boost/mpl/deref.hpp>
+#   include <boost/mpl/apply.hpp>
+#   include <boost/mpl/aux_/value_wknd.hpp>
+#else
+#   include <boost/mpl/find.hpp>
+#   include <boost/mpl/bind.hpp>
+#endif
+
+#include <boost/config.hpp>
+
+namespace boost { namespace mpl {
+
+#if defined(BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL)
+
+// agurt 23/oct/02: has a wrong complexity etc., but at least it works;
+// feel free to contribute a better implementation!
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    , typename Predicate = less<>
+    , typename pred_ = typename lambda<Predicate>::type
+    >
+struct upper_bound
+    : find_if< Sequence, bind2<pred_,T,_> >
+{
+};
+
+#else
+
+namespace aux {
+
+template<
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct upper_bound_step_impl;
+
+template< 
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct upper_bound_step
+{
+    typedef typename eval_if<
+          Distance
+        , upper_bound_step_impl<Distance,Predicate,T,DeferredIterator>
+        , DeferredIterator
+        >::type type;
+};
+    
+template<
+      typename Distance
+    , typename Predicate
+    , typename T
+    , typename DeferredIterator
+    >
+struct upper_bound_step_impl
+{
+    typedef typename divides< Distance, long_<2> >::type offset_;
+    typedef typename DeferredIterator::type iter_;
+    typedef typename advance< iter_,offset_ >::type middle_;
+    typedef typename apply2<
+              Predicate
+            , T
+            , typename deref<middle_>::type
+            >::type cond_;
+
+    typedef typename prior< minus< Distance, offset_ > >::type step_;
+    typedef upper_bound_step< offset_,Predicate,T,DeferredIterator > step_forward_;
+    typedef upper_bound_step< step_,Predicate,T,next<middle_> > step_backward_;
+    typedef typename eval_if<
+          cond_
+        , step_forward_
+        , step_backward_
+        >::type type;
+};
+
+} // namespace aux
+
+template<
+      typename BOOST_MPL_AUX_NA_PARAM(Sequence)
+    , typename BOOST_MPL_AUX_NA_PARAM(T)
+    , typename Predicate = less<>
+    >
+struct upper_bound
+{
+ private:
+    typedef typename lambda<Predicate>::type pred_;
+    typedef typename size<Sequence>::type size_;
+
+ public:
+    typedef typename aux::upper_bound_step<
+        size_,pred_,T,begin<Sequence>
+        >::type type;
+};
+
+#endif // BOOST_MPL_CFG_STRIPPED_DOWN_UPPER_BOUND_IMPL
+
+BOOST_MPL_AUX_NA_SPEC(2, upper_bound)
+
+}}
+
+#endif // BOOST_MPL_UPPER_BOUND_HPP_INCLUDED