Reverted incorrect merge (missing files)
[blender.git] / extern / solid / src / broad / BP_ProxyList.h
1 /*
2  * SOLID - Software Library for Interference Detection
3  * 
4  * Copyright (C) 2001-2003  Dtecta.  All rights reserved.
5  *
6  * This library may be distributed under the terms of the Q Public License
7  * (QPL) as defined by Trolltech AS of Norway and appearing in the file
8  * LICENSE.QPL included in the packaging of this file.
9  *
10  * This library may be distributed and/or modified under the terms of the
11  * GNU General Public License (GPL) version 2 as published by the Free Software
12  * Foundation and appearing in the file LICENSE.GPL included in the
13  * packaging of this file.
14  *
15  * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17  *
18  * Commercial use or any other use of this library not covered by either 
19  * the QPL or the GPL requires an additional license from Dtecta. 
20  * Please contact info@dtecta.com for enquiries about the terms of commercial
21  * use of this library.
22  */
23
24 #ifndef BP_PROXYLIST_H
25 #define BP_PROXYLIST_H
26
27 #include <assert.h>
28
29 #include <vector>
30 #include <algorithm>
31 #include <utility>
32
33 class BP_Proxy;
34
35 typedef std::pair<BP_Proxy *, unsigned int> BP_ProxyEntry; 
36
37 inline bool operator<(const BP_ProxyEntry& a, const BP_ProxyEntry& b) 
38 {
39         return a.first < b.first;
40 }
41
42 class BP_ProxyList : public std::vector<BP_ProxyEntry> {
43 public:
44    BP_ProxyList(size_t n = 20) : std::vector<BP_ProxyEntry>(n) {}      
45
46         iterator add(BP_Proxy *proxy) 
47         {
48                 BP_ProxyEntry entry = std::make_pair(proxy, (unsigned int)0);
49                 iterator it = std::lower_bound(begin(), end(), entry);
50                 if (it == end() || (*it).first != proxy) 
51                 {
52                         it = insert(it, entry);
53                 }
54                 ++(*it).second;
55                 return it;
56         }
57
58         void remove(BP_Proxy *proxy) 
59         {
60                 BP_ProxyEntry entry = std::make_pair(proxy, (unsigned int)0);
61                 iterator it = std::lower_bound(begin(), end(), entry);
62                 if (it != end() && (*it).first == proxy && --(*it).second == 0) 
63                 {
64                         erase(it);      
65                 }       
66         }
67 };
68
69 #endif