1/*
2 * Copyright (c) 1999-2000, Eric Moon.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions, and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions, and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32// set_tools.h
33// e.moon 7may99
34//
35// PURPOSE
36//   Tools to manipulate STL set types.
37//
38// HISTORY
39//   e.moon 27jul99		moved into cortex namespace
40//   e.moon	7may99		created
41
42#ifndef __SET_TOOLS_H__
43#define __SET_TOOLS_H__
44
45#include "cortex_defs.h"
46__BEGIN_CORTEX_NAMESPACE
47
48// delete range of pointer values from set
49template<class iter>
50void ptr_set_delete(iter begin, iter end) {
51	while(begin != end) {
52		if(*begin)
53			delete *begin;
54		++begin;
55	}
56}
57
58// delete range of pointer values from map
59template<class iter>
60void ptr_map_delete(iter begin, iter end) {
61	while(begin != end) {
62		if((*begin).second)
63			delete (*begin).second;
64		++begin;
65	}
66}
67
68// a simple equality-test functor for maps
69template<class key, class value>
70class map_value_equal_to :
71	public std::binary_function<std::pair<key,value>, value, bool> {
72
73public:
74	bool operator()(const std::pair<key,value>& p, const value& v) const {
75		return p.second == v;
76	}
77};
78
79//// a predicate functor adaptor for maps
80//// e.moon 28jul99
81//template<class key, class value>
82//class map_value_predicate_t :
83//	public unary_function<pair<key,value>, bool> {
84//
85//	const unary_function<const value, bool>& fn;
86//
87//public:
88//	map_value_predicate_t(const unary_function<const value, bool>& _fn) : fn(_fn) {}
89//	bool operator()(const std::pair<key,value>& p) const {
90//		return fn(p.second);
91//	}
92//};
93//
94//template<class key, class value>
95//inline map_value_predicate_t<key,value> map_value_predicate(
96//	const unary_function<const value, bool>& fn) {
97//	return map_value_predicate_t<key,value>(fn);
98//}
99
100// copy values from a map subset
101template<class input_iter, class output_iter>
102void map_value_copy(input_iter begin, input_iter end, output_iter to) {
103	while(begin != end) {
104		*to = (*begin).second;
105		++to;
106		++begin;
107	}
108}
109
110// adapt a unary functor to a map (eek)
111template <class pairT, class opT>
112class unary_map_function_t :
113	public std::unary_function<typename opT::argument_type, typename opT::result_type> {
114
115	opT f;
116
117public:
118	unary_map_function_t(const opT& _f) : f(_f) {}
119
120	typename opT::result_type
121	operator()(pairT& p) const {
122		return f(p.second);
123	}
124};
125
126template <class mapT, class opT>
127inline unary_map_function_t<typename mapT::value_type, opT>
128unary_map_function(
129	const mapT& map,
130	const opT& f) {
131	return unary_map_function_t<typename mapT::value_type, opT>(f);
132}
133
134
135__END_CORTEX_NAMESPACE
136#endif /* __SET_TOOLS_H__ */
137