1 /*=========================================================================
2 
3   Program: GDCM (Grassroots DICOM). A DICOM library
4 
5   Copyright (c) 2006-2011 Mathieu Malaterre
6   All rights reserved.
7   See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
8 
9      This software is distributed WITHOUT ANY WARRANTY; without even
10      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11      PURPOSE.  See the above copyright notice for more information.
12 
13 =========================================================================*/
14 /* -----------------------------------------------------------------------------
15  * std_set.i
16  *
17  * SWIG typemaps for std::set< V >
18  *
19  * The C# wrapper is made to look and feel like a C# System.Collections.Generic.ISet<>.
20  *
21  * Using this wrapper is fairly simple. For example, to create a set of integers use:
22  *
23  *   %include <std_set.i>
24  *   %template(SetInt) std::set<int>
25  *
26  * Notes:
27  * 1) IEnumerable<> is implemented in the proxy class which is useful for using LINQ with
28  *    C++ std::set wrappers.
29  *
30  * Warning: heavy macro usage in this file. Use swig -E to get a sane view on the real file contents!
31  * ----------------------------------------------------------------------------- */
32 
33 %{
34 #include <set>
35 #include <algorithm>
36 #include <stdexcept>
37 %}
38 
39 /* V is the C++ value type */
40 %define SWIG_STD_SET_INTERNAL(V)
41 
42 %typemap(csinterfaces) std::set< V > "global::System.IDisposable \n#if SWIG_DOTNET_3\n    , global::System.Collections.Generic.ISet<$typemap(cstype, V)>\n#endif\n";
43 %typemap(cscode) std::set<K, T > %{
44 
$typemap(cstype,V)45   public $typemap(cstype, V) this[$typemap(cstype, V) key] {
46     get {
47       return getitem(key);
48     }
49 
50     set {
51       setitem(value);
52     }
53   }
54 
55 //  public bool TryGetValue($typemap(cstype, V) value) {
56 //    if (this.ContainsKey(key)) {
57 //      value = this[key];
58 //      return true;
59 //    }
60 //    value = default($typemap(cstype, T));
61 //    return false;
62 //  }
63 
64   public int Count {
65     get {
66       return (int)size();
67     }
68   }
69 
70   public bool IsReadOnly {
71     get {
72       return false;
73     }
74   }
75 
76 %}
77 
78   public:
79     set();
80     set(const set< V > &other);
81 
82     typedef V value_type;
83     typedef size_t size_type;
84     size_type size() const;
85     bool empty() const;
86     %rename(Clear) clear;
87     void clear();
88     %extend {
getitem(const value_type & val)89       const value_type& getitem(const value_type& val) throw (std::out_of_range) {
90         std::set< V >::iterator iter = $self->find(val);
91         if (iter != $self->end())
92           return *iter;
93         else
94           throw std::out_of_range("key not found");
95       }
96 
setitem(const value_type & x)97       void setitem(const value_type& x) {
98         (*$self).insert(x);
99       }
100 
Contains(const value_type & val)101       bool Contains(const value_type& val) {
102         std::set< V >::iterator iter = $self->find(val);
103         return iter != $self->end();
104       }
105 
Add(const value_type & val)106       void Add(const value_type& val) throw (std::out_of_range) {
107         std::set< V >::iterator iter = $self->find(val);
108         if (iter != $self->end())
109           throw std::out_of_range("key already exists");
110         $self->insert(val);
111       }
112 
Remove(const value_type & val)113       bool Remove(const value_type& val) {
114         std::set< V >::iterator iter = $self->find(val);
115         if (iter != $self->end()) {
116           $self->erase(iter);
117           return true;
118         }
119         return false;
120       }
121 
122       // create_iterator_begin(), get_next_key() and destroy_iterator work together to provide a collection of keys to C#
123       %apply void *VOID_INT_PTR { std::set< V >::iterator *create_iterator_begin }
124       %apply void *VOID_INT_PTR { std::set< V >::iterator *swigiterator }
125 
create_iterator_begin()126       std::set< V >::iterator *create_iterator_begin() {
127         return new std::set< V >::iterator($self->begin());
128       }
129 
get_next_key(std::set<V>::iterator * swigiterator)130       const value_type& get_next_key(std::set< V >::iterator *swigiterator) {
131         std::set< V >::iterator iter = *swigiterator;
132         swigiterator++;
133         return *iter;
134       }
135 
destroy_iterator(std::set<V>::iterator * swigiterator)136       void destroy_iterator(std::set< V >::iterator *swigiterator) {
137         delete swigiterator;
138       }
139     }
140 
141 
142 %enddef
143 
144 %csmethodmodifiers std::set::size "private"
145 %csmethodmodifiers std::set::getitem "private"
146 %csmethodmodifiers std::set::setitem "private"
147 %csmethodmodifiers std::set::create_iterator_begin "private"
148 %csmethodmodifiers std::set::get_next_key "private"
149 %csmethodmodifiers std::set::destroy_iterator "private"
150 
151 // Default implementation
152 namespace std {
153   template<class V> class set {
154     SWIG_STD_SET_INTERNAL(V)
155   };
156 }
157