1 | |

2 | __#ifndef BOOST_MPL_INDEX_IF_HPP_INCLUDED__ |

3 | __#define BOOST_MPL_INDEX_IF_HPP_INCLUDED__ |

4 | |

5 | *// Copyright Eric Friedman 2003* |

6 | *//* |

7 | *// Distributed under the Boost Software License, Version 1.0. * |

8 | *// (See accompanying file LICENSE_1_0.txt or copy at * |

9 | *// http://www.boost.org/LICENSE_1_0.txt)* |

10 | *//* |

11 | *// See http://www.boost.org/libs/mpl for documentation.* |

12 | |

13 | *// $Id$* |

14 | *// $Date$* |

15 | *// $Revision$* |

16 | |

17 | __#include <boost/mpl/aux_/find_if_pred.hpp>__ |

18 | __#include <boost/mpl/begin_end.hpp>__ |

19 | __#include <boost/mpl/if.hpp>__ |

20 | __#include <boost/mpl/int.hpp>__ |

21 | __#include <boost/mpl/iter_fold_if.hpp>__ |

22 | __#include <boost/mpl/next.hpp>__ |

23 | __#include <boost/mpl/void.hpp>__ |

24 | __#include <boost/mpl/aux_/na_spec.hpp>__ |

25 | __#include <boost/mpl/aux_/lambda_support.hpp>__ |

26 | __#include <boost/type_traits/is_same.hpp>__ |

27 | |

28 | **namespace** boost { **namespace** mpl { |

29 | |

30 | **template**< |

31 | **typename** BOOST_MPL_AUX_NA_PARAM(Sequence) |

32 | , **typename** BOOST_MPL_AUX_NA_PARAM(Predicate) |

33 | > |

34 | **struct** index_if |

35 | { |

36 | **typedef** **typename** iter_fold_if< |

37 | Sequence |

38 | , int_<`0`> |

39 | , next<> |

40 | , aux::find_if_pred<Predicate> |

41 | >::type result_; |

42 | |

43 | **typedef** **typename** end<Sequence>::type not_found_; |

44 | **typedef** **typename** first<result_>::type result_index_; |

45 | **typedef** **typename** second<result_>::type result_iterator_; |

46 | |

47 | **typedef** **typename** if_< |

48 | is_same< result_iterator_,not_found_ > |

49 | , void_ |

50 | , result_index_ |

51 | >::type type; |

52 | |

53 | BOOST_MPL_AUX_LAMBDA_SUPPORT(`2`,index_if,(Sequence,Predicate)) |

54 | }; |

55 | |

56 | BOOST_MPL_AUX_NA_SPEC(`2`, index_if) |

57 | |

58 | }} |

59 | |

60 | __#endif // BOOST_MPL_INDEX_IF_HPP_INCLUDED__ |

61 | |