1 | |

2 | __#ifndef BOOST_MPL_NEGATE_HPP_INCLUDED__ |

3 | __#define BOOST_MPL_NEGATE_HPP_INCLUDED__ |

4 | |

5 | *// Copyright Aleksey Gurtovoy 2000-2004* |

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/integral_c.hpp>__ |

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

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

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

21 | __#include <boost/mpl/aux_/config/eti.hpp>__ |

22 | __#include <boost/mpl/aux_/config/integral.hpp>__ |

23 | __#include <boost/mpl/aux_/config/static_constant.hpp>__ |

24 | |

25 | **namespace** boost { **namespace** mpl { |

26 | |

27 | **template**< **typename** Tag > **struct** negate_impl; |

28 | |

29 | **template**< **typename** T > **struct** negate_tag |

30 | { |

31 | **typedef** **typename** T::tag type; |

32 | }; |

33 | |

34 | **template**< |

35 | **typename** BOOST_MPL_AUX_NA_PARAM(N) |

36 | > |

37 | **struct** negate |

38 | __#if !defined(BOOST_MPL_CFG_MSVC_ETI_BUG)__ |

39 | : negate_impl< |

40 | **typename** negate_tag<N>::type |

41 | >::**template** apply<N>::type |

42 | __#else__ |

43 | : aux::msvc_eti_base< **typename** apply_wrap1< |

44 | negate_impl< **typename** negate_tag<N>::type > |

45 | , N |

46 | >::type >::type |

47 | __#endif__ |

48 | { |

49 | BOOST_MPL_AUX_LAMBDA_SUPPORT(`1`, negate, (N)) |

50 | }; |

51 | |

52 | BOOST_MPL_AUX_NA_SPEC(`1`, negate) |

53 | |

54 | |

55 | __#if defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)__ |

56 | **namespace** aux { |

57 | **template**< **typename** T, T n > **struct** negate_wknd |

58 | { |

59 | BOOST_STATIC_CONSTANT(T, value = -n); |

60 | **typedef** integral_c<T,value> type; |

61 | }; |

62 | } |

63 | __#endif__ |

64 | |

65 | **template**<> |

66 | **struct** negate_impl<integral_c_tag> |

67 | { |

68 | __#if defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC)__ |

69 | **template**< **typename** N > **struct** apply |

70 | : aux::negate_wknd< **typename** N::value_type, N::value > |

71 | __#else__ |

72 | **template**< **typename** N > **struct** apply |

73 | : integral_c< **typename** N::value_type, (-N::value) > |

74 | __#endif__ |

75 | { |

76 | }; |

77 | }; |

78 | |

79 | }} |

80 | |

81 | __#endif // BOOST_MPL_NEGATE_HPP_INCLUDED__ |

82 | |