/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /* ----------------------------------------------------------------------------- * std_set.i * * SWIG typemaps for std::set< V > * * The C# wrapper is made to look and feel like a C# System.Collections.Generic.ISet<>. * * Using this wrapper is fairly simple. For example, to create a set of integers use: * * %include * %template(SetInt) std::set * * Notes: * 1) IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::set wrappers. * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on the real file contents! * ----------------------------------------------------------------------------- */ %{ #include #include #include %} /* V is the C++ value type */ %define SWIG_STD_SET_INTERNAL(V) %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"; %typemap(cscode) std::set %{ public $typemap(cstype, V) this[$typemap(cstype, V) key] { get { return getitem(key); } set { setitem(value); } } // public bool TryGetValue($typemap(cstype, V) value) { // if (this.ContainsKey(key)) { // value = this[key]; // return true; // } // value = default($typemap(cstype, T)); // return false; // } public int Count { get { return (int)size(); } } public bool IsReadOnly { get { return false; } } %} public: set(); set(const set< V > &other); typedef V value_type; typedef size_t size_type; size_type size() const; bool empty() const; %rename(Clear) clear; void clear(); %extend { const value_type& getitem(const value_type& val) throw (std::out_of_range) { std::set< V >::iterator iter = $self->find(val); if (iter != $self->end()) return *iter; else throw std::out_of_range("key not found"); } void setitem(const value_type& x) { (*$self).insert(x); } bool Contains(const value_type& val) { std::set< V >::iterator iter = $self->find(val); return iter != $self->end(); } void Add(const value_type& val) throw (std::out_of_range) { std::set< V >::iterator iter = $self->find(val); if (iter != $self->end()) throw std::out_of_range("key already exists"); $self->insert(val); } bool Remove(const value_type& val) { std::set< V >::iterator iter = $self->find(val); if (iter != $self->end()) { $self->erase(iter); return true; } return false; } // create_iterator_begin(), get_next_key() and destroy_iterator work together to provide a collection of keys to C# %apply void *VOID_INT_PTR { std::set< V >::iterator *create_iterator_begin } %apply void *VOID_INT_PTR { std::set< V >::iterator *swigiterator } std::set< V >::iterator *create_iterator_begin() { return new std::set< V >::iterator($self->begin()); } const value_type& get_next_key(std::set< V >::iterator *swigiterator) { std::set< V >::iterator iter = *swigiterator; swigiterator++; return *iter; } void destroy_iterator(std::set< V >::iterator *swigiterator) { delete swigiterator; } } %enddef %csmethodmodifiers std::set::size "private" %csmethodmodifiers std::set::getitem "private" %csmethodmodifiers std::set::setitem "private" %csmethodmodifiers std::set::create_iterator_begin "private" %csmethodmodifiers std::set::get_next_key "private" %csmethodmodifiers std::set::destroy_iterator "private" // Default implementation namespace std { template class set { SWIG_STD_SET_INTERNAL(V) }; }