-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathc_function.c
146 lines (123 loc) · 3.86 KB
/
c_function.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* 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 appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996
* Silicon Graphics Computer Systems, Inc.
*
* 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 appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/*
Copyright (c) 2007 Wenbo Lao(Rob Lao)
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
Wenbo Lao(Rob Lao)
viewpl(at)gmail.com
*/
#include "c_function.h"
#include "c_pair.h"
static c_bool _c_unary_negate_impl(c_unary_predicate * thiz, value_type val)
{
return !((UNARY_PREDICATE)(thiz->_l))(val);
}
c_unary_predicate c_unary_negate(UNARY_PREDICATE unary_pred)
{
c_unary_predicate up;
up.O = _c_unary_negate_impl;
up._l = unary_pred;
return up;
}
static c_bool _c_binary_negate_impl(c_binary_predicate * thiz, value_type val1, value_type val2)
{
return !((BINARY_PREDICATE)(thiz->_l))(val1, val2);
}
c_binary_predicate c_binary_negate(BINARY_PREDICATE binary_pred)
{
c_binary_predicate bp;
bp.O = _c_binary_negate_impl;
bp._l = binary_pred;
return bp;
}
static value_type _c_identity_impl(c_unary_function * thiz, value_type val)
{
return val;
}
c_unary_function c_identity()
{
c_unary_function uf;
uf.O = _c_identity_impl;
uf._l = NULL;
return uf;
}
static value_type _c_select1st_impl(c_unary_function * thiz, value_type val)
{
return ((c_ppair)(val))->first;
}
c_unary_function c_select1st()
{
c_unary_function uf;
uf.O = _c_select1st_impl;
uf._l = NULL;
return uf;
}
static value_type _c_select1stptr_impl(c_unary_function * thiz, value_type val)
{
return (value_type)(&((c_ppair)(val))->first);
}
c_unary_function c_select1stptr()
{
c_unary_function uf;
uf.O = _c_select1stptr_impl;
uf._l = NULL;
return uf;
}
static c_bool _c_unary_adapt_impl(c_unary_predicate * thiz, value_type val)
{
return ((UNARY_PREDICATE)(thiz->_l))(val);
}
c_unary_predicate c_unary_adapt(UNARY_PREDICATE unary_pred)
{
c_unary_predicate up;
up.O = _c_unary_adapt_impl;
up._l = unary_pred;
return up;
}
static c_bool _c_binary_adapt_impl(c_binary_predicate * thiz, value_type val1, value_type val2)
{
return ((BINARY_PREDICATE)(thiz->_l))(val1, val2);
}
c_binary_predicate c_binary_adapt(BINARY_PREDICATE binary_pred)
{
c_binary_predicate bp;
bp.O = _c_binary_adapt_impl;
bp._l = binary_pred;
return bp;
}