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