blob: 5d68fdbe0344377eef09dc65f1c02e5a19ffe0e8 [file] [log] [blame]
if [ catch { load ./li_carrays[info sharedlibextension] Li_carrays} err_msg ] {
puts stderr "Could not load shared object:\n$err_msg"
}
# Testing for %array_functions(int,intArray)
set ary [new_intArray 2]
intArray_setitem $ary 0 0
intArray_setitem $ary 1 1
if {[intArray_getitem $ary 0] != 0} {
error "wrong value index 0"
}
if {[intArray_getitem $ary 1] != 1} {
error "wrong value index 1"
}
delete_intArray $ary
# Testing for %array_class(double, doubleArray)
doubleArray d 10
doubleArray_setitem d 0 7
doubleArray_setitem d 5 [expr [doubleArray_getitem d 0] + 3]
if {[expr [doubleArray_getitem d 5] + [doubleArray_getitem d 0]] != 17} {
error "wrong value doubleArray"
}
# Tcl Array wrapper based on Tcl.html documentation "Building new kinds of Tcl interfaces (in Tcl)"
proc Array {type size} {
set ptr [new_$type $size]
set code {
set method [lindex $args 0]
set parms [concat $ptr [lrange $args 1 end]]
switch $method {
get {return [eval "${type}_getitem $parms"]}
set {return [eval "${type}_setitem $parms"]}
delete {eval "delete_$type $ptr; rename $ptr {}"}
}
}
# Create a procedure
uplevel "proc $ptr args {set ptr $ptr; set type $type;$code}"
return $ptr
}
# The memory handling for Tcl is not working properly.
# %newobject (not used here though) is crippled and does not take ownership of the underlying
# pointer - see SWIGTYPE * typemap overrides in tcltypemaps.swg.
#
# As soon as a is set below, it gets deleted by the interpreter, even though $a is used a
# few lines later. The interpreter seems to replace the command object created in
# SWIG_Tcl_NewInstanceObj some sort of generic one.
# The underlying C array is not actually deleted (it leaks) when $a is deleted, so the code
# using $a does actually seem to work.
set a [Array doubleArray 100] ;# Create a double [100]
for {set i 0} {$i < 100} {incr i 1} { ;# Clear the array
$a set $i 0.0
}
$a set 3 3.1455 ;# Set an individual element
set b [$a get 10] ;# Retrieve an element
set ia [Array intArray 50] ;# Create an int[50]
for {set i 0} {$i < 50} {incr i 1} { ;# Clear it
$ia set $i 0
}
$ia set 3 7 ;# Set an individual element
set ib [$ia get 10] ;# Get an individual element
$a delete ;# Destroy a
$ia delete ;# Destroy ia