OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [libstdc++-v3/] [include/] [backward/] [binders.h] - Blame information for rev 826

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 424 jeremybenn
// Functor implementations -*- C++ -*-
2
 
3
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010
4
// Free Software Foundation, Inc.
5
//
6
// This file is part of the GNU ISO C++ Library.  This library is free
7
// software; you can redistribute it and/or modify it under the
8
// terms of the GNU General Public License as published by the
9
// Free Software Foundation; either version 3, or (at your option)
10
// any later version.
11
 
12
// This library is distributed in the hope that it will be useful,
13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
// GNU General Public License for more details.
16
 
17
// Under Section 7 of GPL version 3, you are granted additional
18
// permissions described in the GCC Runtime Library Exception, version
19
// 3.1, as published by the Free Software Foundation.
20
 
21
// You should have received a copy of the GNU General Public License and
22
// a copy of the GCC Runtime Library Exception along with this program;
23
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
// <http://www.gnu.org/licenses/>.
25
 
26
/*
27
 *
28
 * Copyright (c) 1994
29
 * Hewlett-Packard Company
30
 *
31
 * Permission to use, copy, modify, distribute and sell this software
32
 * and its documentation for any purpose is hereby granted without fee,
33
 * provided that the above copyright notice appear in all copies and
34
 * that both that copyright notice and this permission notice appear
35
 * in supporting documentation.  Hewlett-Packard Company makes no
36
 * representations about the suitability of this software for any
37
 * purpose.  It is provided "as is" without express or implied warranty.
38
 *
39
 *
40
 * Copyright (c) 1996-1998
41
 * Silicon Graphics Computer Systems, Inc.
42
 *
43
 * Permission to use, copy, modify, distribute and sell this software
44
 * and its documentation for any purpose is hereby granted without fee,
45
 * provided that the above copyright notice appear in all copies and
46
 * that both that copyright notice and this permission notice appear
47
 * in supporting documentation.  Silicon Graphics makes no
48
 * representations about the suitability of this software for any
49
 * purpose.  It is provided "as is" without express or implied warranty.
50
 */
51
 
52
/** @file backward/binders.h
53
 *  This is an internal header file, included by other library headers.
54
 *  You should not attempt to use it directly.
55
 */
56
 
57
#ifndef _BACKWARD_BINDERS_H
58
#define _BACKWARD_BINDERS_H 1
59
 
60
_GLIBCXX_BEGIN_NAMESPACE(std)
61
 
62
  // 20.3.6 binders
63
  /** @defgroup binders Binder Classes
64
   * @ingroup functors
65
   *
66
   *  Binders turn functions/functors with two arguments into functors
67
   *  with a single argument, storing an argument to be applied later.
68
   *  For example, a variable @c B of type @c binder1st is constructed
69
   *  from a functor @c f and an argument @c x. Later, B's @c
70
   *  operator() is called with a single argument @c y. The return
71
   *  value is the value of @c f(x,y). @c B can be @a called with
72
   *  various arguments (y1, y2, ...) and will in turn call @c
73
   *  f(x,y1), @c f(x,y2), ...
74
   *
75
   *  The function @c bind1st is provided to save some typing. It takes the
76
   *  function and an argument as parameters, and returns an instance of
77
   *  @c binder1st.
78
   *
79
   *  The type @c binder2nd and its creator function @c bind2nd do the same
80
   *  thing, but the stored argument is passed as the second parameter instead
81
   *  of the first, e.g., @c bind2nd(std::minus<float>,1.3) will create a
82
   *  functor whose @c operator() accepts a floating-point number, subtracts
83
   *  1.3 from it, and returns the result. (If @c bind1st had been used,
84
   *  the functor would perform <em>1.3 - x</em> instead.
85
   *
86
   *  Creator-wrapper functions like @c bind1st are intended to be used in
87
   *  calling algorithms. Their return values will be temporary objects.
88
   *  (The goal is to not require you to type names like
89
   *  @c std::binder1st<std::plus<int>> for declaring a variable to hold the
90
   *  return value from @c bind1st(std::plus<int>,5).
91
   *
92
   *  These become more useful when combined with the composition functions.
93
   *
94
   *  @{
95
   */
96
  /// One of the @link binders binder functors@endlink.
97
  template<typename _Operation>
98
    class binder1st
99
    : public unary_function<typename _Operation::second_argument_type,
100
                            typename _Operation::result_type>
101
    {
102
    protected:
103
      _Operation op;
104
      typename _Operation::first_argument_type value;
105
 
106
    public:
107
      binder1st(const _Operation& __x,
108
                const typename _Operation::first_argument_type& __y)
109
      : op(__x), value(__y) { }
110
 
111
      typename _Operation::result_type
112
      operator()(const typename _Operation::second_argument_type& __x) const
113
      { return op(value, __x); }
114
 
115
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
116
      // 109.  Missing binders for non-const sequence elements
117
      typename _Operation::result_type
118
      operator()(typename _Operation::second_argument_type& __x) const
119
      { return op(value, __x); }
120
    } _GLIBCXX_DEPRECATED_ATTR;
121
 
122
  /// One of the @link binders binder functors@endlink.
123
  template<typename _Operation, typename _Tp>
124
    inline binder1st<_Operation>
125
    bind1st(const _Operation& __fn, const _Tp& __x)
126
    {
127
      typedef typename _Operation::first_argument_type _Arg1_type;
128
      return binder1st<_Operation>(__fn, _Arg1_type(__x));
129
    }
130
 
131
  /// One of the @link binders binder functors@endlink.
132
  template<typename _Operation>
133
    class binder2nd
134
    : public unary_function<typename _Operation::first_argument_type,
135
                            typename _Operation::result_type>
136
    {
137
    protected:
138
      _Operation op;
139
      typename _Operation::second_argument_type value;
140
 
141
    public:
142
      binder2nd(const _Operation& __x,
143
                const typename _Operation::second_argument_type& __y)
144
      : op(__x), value(__y) { }
145
 
146
      typename _Operation::result_type
147
      operator()(const typename _Operation::first_argument_type& __x) const
148
      { return op(__x, value); }
149
 
150
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
151
      // 109.  Missing binders for non-const sequence elements
152
      typename _Operation::result_type
153
      operator()(typename _Operation::first_argument_type& __x) const
154
      { return op(__x, value); }
155
    } _GLIBCXX_DEPRECATED_ATTR;
156
 
157
  /// One of the @link binders binder functors@endlink.
158
  template<typename _Operation, typename _Tp>
159
    inline binder2nd<_Operation>
160
    bind2nd(const _Operation& __fn, const _Tp& __x)
161
    {
162
      typedef typename _Operation::second_argument_type _Arg2_type;
163
      return binder2nd<_Operation>(__fn, _Arg2_type(__x));
164
    }
165
  /** @}  */
166
 
167
_GLIBCXX_END_NAMESPACE
168
 
169
#endif /* _BACKWARD_BINDERS_H */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.