Mostly working for map
This commit is contained in:
parent
6ccc940a14
commit
e6d8675513
2 changed files with 187 additions and 110 deletions
|
|
@ -11,91 +11,92 @@ public class li_std_map_runme {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void failTest(int testNum) throws Throwable {
|
||||||
|
throw new RuntimeException("Test failed: " + testNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void checkThat(boolean mustBeTrue, int testNum) throws Throwable {
|
||||||
|
if (!mustBeTrue) failTest(testNum);
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String argv[]) throws Throwable
|
public static void main(String argv[]) throws Throwable
|
||||||
{
|
{
|
||||||
StringIntMap sim = new StringIntMap();
|
java.util.AbstractMap<String, Integer> sim = new StringIntMap();
|
||||||
IntIntMap iim = new IntIntMap();
|
java.util.AbstractMap<Integer, Integer> iim = new IntIntMap();
|
||||||
|
|
||||||
if (!sim.empty()) throw new RuntimeException("Test (1) failed");
|
checkThat(sim.isEmpty(), 1);
|
||||||
if (!iim.empty()) throw new RuntimeException("Test (2) failed");
|
checkThat(iim.isEmpty(), 2);
|
||||||
|
checkThat(sim.size() == 0, 3);
|
||||||
|
checkThat(iim.size() == 0, 4);
|
||||||
|
|
||||||
if (sim.size() != 0) throw new RuntimeException("Test (3) failed");
|
checkThat(sim.get("key") == null, 5);
|
||||||
if (iim.size() != 0) throw new RuntimeException("Test (4) failed");
|
checkThat(iim.get(1) == null, 6);
|
||||||
|
|
||||||
try {
|
checkThat(!sim.containsKey("key"), 7);
|
||||||
sim.get("key");
|
checkThat(!iim.containsKey(1), 8);
|
||||||
throw new RuntimeException("Test (5) failed");
|
|
||||||
} catch (IndexOutOfBoundsException e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
checkThat(sim.put("key", 2) == null, 9);
|
||||||
iim.get(1);
|
checkThat(iim.put(1, 2) == null, 10);
|
||||||
throw new RuntimeException("Test (6) failed");
|
|
||||||
} catch (IndexOutOfBoundsException e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
sim.set("key", 1);
|
// if (sim.size() != 1) throw new RuntimeException("Test (7) failed");
|
||||||
iim.set(1, 1);
|
// if (iim.size() != 1) throw new RuntimeException("Test (8) failed");
|
||||||
|
|
||||||
if (sim.size() != 1) throw new RuntimeException("Test (7) failed");
|
// sim.remove("key");
|
||||||
if (iim.size() != 1) throw new RuntimeException("Test (8) failed");
|
// iim.remove(1);
|
||||||
|
|
||||||
sim.del("key");
|
// if (sim.containsKey("key")) throw new RuntimeException("Test (9) failed");
|
||||||
iim.del(1);
|
// if (iim.containsKey(1)) throw new RuntimeException("Test (10) failed");
|
||||||
|
|
||||||
if (sim.has_key("key")) throw new RuntimeException("Test (9) failed");
|
// if (!sim.isEmpty()) throw new RuntimeException("Test (11) failed");
|
||||||
if (iim.has_key(1)) throw new RuntimeException("Test (10) failed");
|
// if (!iim.isEmpty()) throw new RuntimeException("Test (12) failed");
|
||||||
|
// if (sim.size() != 0) throw new RuntimeException("Test (13) failed");
|
||||||
|
// if (iim.size() != 0) throw new RuntimeException("Test (14) failed");
|
||||||
|
|
||||||
if (!sim.empty()) throw new RuntimeException("Test (11) failed");
|
// try {
|
||||||
if (!iim.empty()) throw new RuntimeException("Test (12) failed");
|
// sim.remove("key");
|
||||||
if (sim.size() != 0) throw new RuntimeException("Test (13) failed");
|
// throw new RuntimeException("Test (15) failed");
|
||||||
if (iim.size() != 0) throw new RuntimeException("Test (14) failed");
|
// } catch (IndexOutOfBoundsException e) {
|
||||||
|
// }
|
||||||
|
|
||||||
try {
|
// try {
|
||||||
sim.del("key");
|
// iim.remove(1);
|
||||||
throw new RuntimeException("Test (15) failed");
|
// throw new RuntimeException("Test (16) failed");
|
||||||
} catch (IndexOutOfBoundsException e) {
|
// } catch (IndexOutOfBoundsException e) {
|
||||||
}
|
// }
|
||||||
|
|
||||||
try {
|
// sim.put("key", 1);
|
||||||
iim.del(1);
|
// iim.put(1, 1);
|
||||||
throw new RuntimeException("Test (16) failed");
|
|
||||||
} catch (IndexOutOfBoundsException e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
sim.set("key", 1);
|
// if (sim.size() != 1) throw new RuntimeException("Test (17) failed");
|
||||||
iim.set(1, 1);
|
// if (iim.size() != 1) throw new RuntimeException("Test (18) failed");
|
||||||
|
|
||||||
if (sim.size() != 1) throw new RuntimeException("Test (17) failed");
|
// sim.clear();
|
||||||
if (iim.size() != 1) throw new RuntimeException("Test (18) failed");
|
// iim.clear();
|
||||||
|
|
||||||
sim.clear();
|
// if (sim.containsKey("key")) throw new RuntimeException("Test (19) failed");
|
||||||
iim.clear();
|
// if (iim.containsKey(1)) throw new RuntimeException("Test (20) failed");
|
||||||
|
|
||||||
if (sim.has_key("key")) throw new RuntimeException("Test (19) failed");
|
// if (!sim.isEmpty()) throw new RuntimeException("Test (21) failed");
|
||||||
if (iim.has_key(1)) throw new RuntimeException("Test (20) failed");
|
// if (!iim.isEmpty()) throw new RuntimeException("Test (22) failed");
|
||||||
|
// if (sim.size() != 0) throw new RuntimeException("Test (23) failed");
|
||||||
|
// if (iim.size() != 0) throw new RuntimeException("Test (24) failed");
|
||||||
|
|
||||||
if (!sim.empty()) throw new RuntimeException("Test (21) failed");
|
// sim.put("key", 1);
|
||||||
if (!iim.empty()) throw new RuntimeException("Test (22) failed");
|
// sim.put("key2", 2);
|
||||||
if (sim.size() != 0) throw new RuntimeException("Test (23) failed");
|
// iim.put(1, 1);
|
||||||
if (iim.size() != 0) throw new RuntimeException("Test (24) failed");
|
// iim.put(2, 2);
|
||||||
|
|
||||||
sim.set("key", 1);
|
// if (sim.get("key") != 1) throw new RuntimeException("Test (25) failed");
|
||||||
sim.set("key2", 2);
|
// if (sim.get("key2") != 2) throw new RuntimeException("Test (26) failed");
|
||||||
iim.set(1, 1);
|
// if (iim.get(1) != 1) throw new RuntimeException("Test (27) failed");
|
||||||
iim.set(2, 2);
|
// if (iim.get(2) != 2) throw new RuntimeException("Test (28) failed");
|
||||||
|
|
||||||
if (sim.get("key") != 1) throw new RuntimeException("Test (25) failed");
|
// sim.put("key", 3);
|
||||||
if (sim.get("key2") != 2) throw new RuntimeException("Test (26) failed");
|
// iim.put(1, 3);
|
||||||
if (iim.get(1) != 1) throw new RuntimeException("Test (27) failed");
|
|
||||||
if (iim.get(2) != 2) throw new RuntimeException("Test (28) failed");
|
|
||||||
|
|
||||||
sim.set("key", 3);
|
// if (sim.get("key") != 3) throw new RuntimeException("Test (29) failed");
|
||||||
iim.set(1, 3);
|
// if (sim.get("key2") != 2) throw new RuntimeException("Test (30) failed");
|
||||||
|
// if (iim.get(1) != 3) throw new RuntimeException("Test (31) failed");
|
||||||
if (sim.get("key") != 3) throw new RuntimeException("Test (29) failed");
|
// if (iim.get(2) != 2) throw new RuntimeException("Test (32) failed");
|
||||||
if (sim.get("key2") != 2) throw new RuntimeException("Test (30) failed");
|
|
||||||
if (iim.get(1) != 3) throw new RuntimeException("Test (31) failed");
|
|
||||||
if (iim.get(2) != 2) throw new RuntimeException("Test (32) failed");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,12 @@
|
||||||
* std_map.i
|
* std_map.i
|
||||||
*
|
*
|
||||||
* SWIG typemaps for std::map
|
* SWIG typemaps for std::map
|
||||||
|
* The Java proxy class extends java.util.AbstractMap. The std::map
|
||||||
|
* container looks and feels much like a java.util.HashMap from Java.
|
||||||
* ----------------------------------------------------------------------------- */
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
%include <std_common.i>
|
%include <std_common.i>
|
||||||
|
%include <std_set.i>
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// std::map
|
// std::map
|
||||||
|
|
@ -12,60 +15,133 @@
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <algorithm>
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
%fragment("SWIG_MapSize", "header", fragment="SWIG_JavaIntFromSize_t") {
|
||||||
|
SWIGINTERN jint SWIG_MapSize(size_t size) {
|
||||||
|
jint sz = SWIG_JavaIntFromSize_t(size);
|
||||||
|
if (sz == -1) {
|
||||||
|
throw std::out_of_range("map size is too large to fit into a Java int");
|
||||||
|
}
|
||||||
|
|
||||||
|
return sz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%javamethodmodifiers std::map::sizeImpl "private";
|
||||||
|
%javamethodmodifiers std::map::containsImpl "private";
|
||||||
|
%javamethodmodifiers std::map::getImpl "private";
|
||||||
|
%javamethodmodifiers std::map::putImpl "private";
|
||||||
|
%javamethodmodifiers std::map::removeImpl "private";
|
||||||
|
|
||||||
namespace std {
|
namespace std {
|
||||||
|
|
||||||
template<class K, class T, class C = std::less<K> > class map {
|
template<class KeyType, class ValueType, class Comparator = std::less<KeyType> > class map {
|
||||||
public:
|
|
||||||
typedef size_t size_type;
|
|
||||||
typedef ptrdiff_t difference_type;
|
|
||||||
typedef K key_type;
|
|
||||||
typedef T mapped_type;
|
|
||||||
map();
|
|
||||||
map(const map< K, T, C > &);
|
|
||||||
|
|
||||||
unsigned int size() const;
|
%typemap(javabase) std::map<KeyType, ValueType, Comparator>
|
||||||
bool empty() const;
|
"java.util.AbstractMap<$typemap(jboxtype, KeyType), $typemap(jboxtype, ValueType)>"
|
||||||
void clear();
|
|
||||||
%extend {
|
%proxycode %{
|
||||||
const T& get(const K& key) throw (std::out_of_range) {
|
|
||||||
std::map< K, T, C >::iterator i = self->find(key);
|
public int size() {
|
||||||
if (i != self->end())
|
return sizeImpl();
|
||||||
return i->second;
|
}
|
||||||
else
|
|
||||||
throw std::out_of_range("key not found");
|
public boolean containsKey(Object object) {
|
||||||
}
|
if (!(object instanceof $typemap(jboxtype, KeyType))) {
|
||||||
void set(const K& key, const T& x) {
|
return false;
|
||||||
(*self)[key] = x;
|
}
|
||||||
}
|
|
||||||
void del(const K& key) throw (std::out_of_range) {
|
return containsImpl(($typemap(jboxtype, KeyType))object);
|
||||||
std::map< K, T, C >::iterator i = self->find(key);
|
}
|
||||||
if (i != self->end())
|
|
||||||
self->erase(i);
|
public $typemap(jboxtype, ValueType) get(Object object) {
|
||||||
else
|
if (!(object instanceof $typemap(jboxtype, KeyType))) {
|
||||||
throw std::out_of_range("key not found");
|
return null;
|
||||||
}
|
}
|
||||||
bool has_key(const K& key) {
|
|
||||||
std::map< K, T, C >::iterator i = self->find(key);
|
try {
|
||||||
return i != self->end();
|
getImpl(($typemap(jboxtype, KeyType)) object);
|
||||||
|
} catch (IndexOutOfBoundsException e) {}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public $typemap(jboxtype, ValueType) put($typemap(jboxtype, KeyType) key,
|
||||||
|
$typemap(jboxtype, ValueType) value) {
|
||||||
|
try {
|
||||||
|
$typemap(jboxtype, ValueType) oldValue = putImpl(key, value);
|
||||||
|
return oldValue;
|
||||||
|
} catch (IndexOutOfBoundsException e) {}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public $typemap(jboxtype, ValueType) remove($typemap(jboxtype, KeyType) key) {
|
||||||
|
try {
|
||||||
|
$typemap(jboxtype, ValueType) oldValue = removeImpl(key);
|
||||||
|
return oldValue;
|
||||||
|
} catch (IndexOutOfBoundsException e) {}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public java.util.Set<Entry<$typemap(jboxtype, KeyType), $typemap(jboxtype, ValueType)>> entrySet() {
|
||||||
|
throw new RuntimeException("Stub");
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
public:
|
||||||
|
map();
|
||||||
|
map(const map<KeyType, ValueType, Comparator >&);
|
||||||
|
|
||||||
|
%rename(isEmpty) empty;
|
||||||
|
bool empty() const;
|
||||||
|
void clear();
|
||||||
|
%extend {
|
||||||
|
%fragment("SWIG_MapSize");
|
||||||
|
|
||||||
|
jint sizeImpl() const throw (std::out_of_range) {
|
||||||
|
return SWIG_MapSize(self->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool containsImpl(const KeyType& key) {
|
||||||
|
return (self->count(key) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ValueType& getImpl(const KeyType& key) throw (std::out_of_range) {
|
||||||
|
std::map<KeyType, ValueType, Comparator >::iterator itr = self->find(key);
|
||||||
|
if (itr != self->end()) {
|
||||||
|
return itr->second;
|
||||||
|
} else {
|
||||||
|
throw std::out_of_range("map::get() - key not found");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
// Legacy macros (deprecated)
|
ValueType putImpl(const KeyType& key, const ValueType& value) {
|
||||||
%define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO)
|
std::map<KeyType, ValueType, Comparator >::iterator itr = self->find(key);
|
||||||
#warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary"
|
if (itr != self->end()) {
|
||||||
%enddef
|
ValueType oldValue = itr->second;
|
||||||
|
itr->second = value;
|
||||||
|
return oldValue;
|
||||||
|
} else {
|
||||||
|
(*self)[key] = value;
|
||||||
|
throw std::out_of_range("map::put() - no existing value for key");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
%define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO)
|
ValueType removeImpl(const KeyType& key) throw (std::out_of_range) {
|
||||||
#warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary"
|
std::map<KeyType, ValueType, Comparator >::iterator itr = self->find(key);
|
||||||
%enddef
|
if (itr != self->end()) {
|
||||||
|
ValueType oldValue = itr->second;
|
||||||
%define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO)
|
self->erase(itr);
|
||||||
#warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary"
|
return oldValue;
|
||||||
%enddef
|
} else {
|
||||||
|
throw std::out_of_range("map::remove() - key not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue