# do not dump Octave core if exist("crash_dumps_octave_core", "builtin") crash_dumps_octave_core(0); endif 1; li_boost_shared_ptr; function verifyValue(expected, got) if (expected ~= got) error("verify value failed.");% Expected: ", expected, " Got: ", got) end endfunction function verifyCount(expected, k) got = use_count(k); if (expected ~= got) error("verify use_count failed. Expected: %d Got: %d ", expected, got); end endfunction function runtest() li_boost_shared_ptr; # KTTODO this needs to be here at present. Global module failure? # simple shared_ptr usage - created in C++ k = Klass("me oh my"); val = k.getValue(); verifyValue("me oh my", val) verifyCount(1, k) # simple shared_ptr usage - not created in C++ k = factorycreate(); val = k.getValue(); verifyValue("factorycreate", val) verifyCount(1, k) # pass by shared_ptr k = Klass("me oh my"); kret = smartpointertest(k); val = kret.getValue(); verifyValue("me oh my smartpointertest", val) verifyCount(2, k) verifyCount(2, kret) # pass by shared_ptr pointer k = Klass("me oh my"); kret = smartpointerpointertest(k); val = kret.getValue(); verifyValue("me oh my smartpointerpointertest", val) verifyCount(2, k) verifyCount(2, kret) # pass by shared_ptr reference k = Klass("me oh my"); kret = smartpointerreftest(k); val = kret.getValue(); verifyValue("me oh my smartpointerreftest", val) verifyCount(2, k) verifyCount(2, kret) # pass by shared_ptr pointer reference k = Klass("me oh my"); kret = smartpointerpointerreftest(k); val = kret.getValue(); verifyValue("me oh my smartpointerpointerreftest", val) verifyCount(2, k) verifyCount(2, kret) # const pass by shared_ptr k = Klass("me oh my"); kret = constsmartpointertest(k); val = kret.getValue(); verifyValue("me oh my", val) verifyCount(2, k) verifyCount(2, kret) # const pass by shared_ptr pointer k = Klass("me oh my"); kret = constsmartpointerpointertest(k); val = kret.getValue(); verifyValue("me oh my", val) verifyCount(2, k) verifyCount(2, kret) # const pass by shared_ptr reference k = Klass("me oh my"); kret = constsmartpointerreftest(k); val = kret.getValue(); verifyValue("me oh my", val) verifyCount(2, k) verifyCount(2, kret) # pass by value k = Klass("me oh my"); kret = valuetest(k); val = kret.getValue(); verifyValue("me oh my valuetest", val) verifyCount(1, k) verifyCount(1, kret) # pass by pointer k = Klass("me oh my"); kret = pointertest(k); val = kret.getValue(); verifyValue("me oh my pointertest", val) verifyCount(1, k) verifyCount(1, kret) # pass by reference k = Klass("me oh my"); kret = reftest(k); val = kret.getValue(); verifyValue("me oh my reftest", val) verifyCount(1, k) verifyCount(1, kret) # pass by pointer reference k = Klass("me oh my"); kret = pointerreftest(k); val = kret.getValue(); verifyValue("me oh my pointerreftest", val) verifyCount(1, k) verifyCount(1, kret) # null tests #KTODO None not defined # k = None; # if (smartpointertest(k) ~= None) # error("return was not null") # end # if (smartpointerpointertest(k) ~= None) # error("return was not null") # end # if (smartpointerreftest(k) ~= None) # error("return was not null") # end # if (smartpointerpointerreftest(k) ~= None) # error("return was not null") # end # if (nullsmartpointerpointertest(None) ~= "null pointer") # error("not null smartpointer pointer") # end # # try: # # valuetest(k) # # error("Failed to catch null pointer") # # except ValueError: # # pass # if (pointertest(k) ~= None) # error("return was not null") # end # # try: # # reftest(k) # # error("Failed to catch null pointer") # # except ValueError: # # pass # $owner k = pointerownertest(); val = k.getValue(); verifyValue("pointerownertest", val) verifyCount(1, k) k = smartpointerpointerownertest(); val = k.getValue(); verifyValue("smartpointerpointerownertest", val) verifyCount(1, k) # //////////////////////////////// Derived class //////////////////////////////////////// # derived pass by shared_ptr k = KlassDerived("me oh my"); kret = derivedsmartptrtest(k); val = kret.getValue(); verifyValue("me oh my derivedsmartptrtest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # derived pass by shared_ptr pointer k = KlassDerived("me oh my"); kret = derivedsmartptrpointertest(k); val = kret.getValue(); verifyValue("me oh my derivedsmartptrpointertest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # derived pass by shared_ptr ref k = KlassDerived("me oh my"); kret = derivedsmartptrreftest(k); val = kret.getValue(); verifyValue("me oh my derivedsmartptrreftest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # derived pass by shared_ptr pointer ref k = KlassDerived("me oh my"); kret = derivedsmartptrpointerreftest(k); val = kret.getValue(); verifyValue("me oh my derivedsmartptrpointerreftest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # derived pass by pointer k = KlassDerived("me oh my"); kret = derivedpointertest(k); val = kret.getValue(); verifyValue("me oh my derivedpointertest-Derived", val) verifyCount(1, k) verifyCount(1, kret) # derived pass by ref k = KlassDerived("me oh my"); kret = derivedreftest(k); val = kret.getValue(); verifyValue("me oh my derivedreftest-Derived", val) verifyCount(1, k) verifyCount(1, kret) # //////////////////////////////// Derived and base class mixed //////////////////////////////////////// # pass by shared_ptr (mixed) k = KlassDerived("me oh my"); kret = smartpointertest(k); val = kret.getValue(); verifyValue("me oh my smartpointertest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # pass by shared_ptr pointer (mixed) k = KlassDerived("me oh my"); kret = smartpointerpointertest(k); val = kret.getValue(); verifyValue("me oh my smartpointerpointertest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # pass by shared_ptr reference (mixed) k = KlassDerived("me oh my"); kret = smartpointerreftest(k); val = kret.getValue(); verifyValue("me oh my smartpointerreftest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # pass by shared_ptr pointer reference (mixed) k = KlassDerived("me oh my"); kret = smartpointerpointerreftest(k); val = kret.getValue(); verifyValue("me oh my smartpointerpointerreftest-Derived", val) verifyCount(2, k) verifyCount(2, kret) # pass by value (mixed) k = KlassDerived("me oh my"); kret = valuetest(k); val = kret.getValue(); verifyValue("me oh my valuetest", val) # note slicing verifyCount(1, k) verifyCount(1, kret) # pass by pointer (mixed) k = KlassDerived("me oh my"); kret = pointertest(k); val = kret.getValue(); verifyValue("me oh my pointertest-Derived", val) verifyCount(1, k) verifyCount(1, kret) # pass by ref (mixed) k = KlassDerived("me oh my"); kret = reftest(k); val = kret.getValue(); verifyValue("me oh my reftest-Derived", val) verifyCount(1, k) verifyCount(1, kret) # //////////////////////////////// Overloading tests //////////////////////////////////////// # Base class k = Klass("me oh my"); verifyValue(overload_rawbyval(k), "rawbyval") verifyValue(overload_rawbyref(k), "rawbyref") verifyValue(overload_rawbyptr(k), "rawbyptr") verifyValue(overload_rawbyptrref(k), "rawbyptrref") verifyValue(overload_smartbyval(k), "smartbyval") verifyValue(overload_smartbyref(k), "smartbyref") verifyValue(overload_smartbyptr(k), "smartbyptr") verifyValue(overload_smartbyptrref(k), "smartbyptrref") # Derived class k = KlassDerived("me oh my"); verifyValue(overload_rawbyval(k), "rawbyval") verifyValue(overload_rawbyref(k), "rawbyref") verifyValue(overload_rawbyptr(k), "rawbyptr") verifyValue(overload_rawbyptrref(k), "rawbyptrref") verifyValue(overload_smartbyval(k), "smartbyval") verifyValue(overload_smartbyref(k), "smartbyref") verifyValue(overload_smartbyptr(k), "smartbyptr") verifyValue(overload_smartbyptrref(k), "smartbyptrref") # 3rd derived class k = Klass3rdDerived("me oh my"); val = k.getValue(); verifyValue("me oh my-3rdDerived", val) verifyCount(1, k) val = test3rdupcast(k); verifyValue("me oh my-3rdDerived", val) verifyCount(1, k) # //////////////////////////////// Member variables //////////////////////////////////////// # smart pointer by value m = MemberVariables(); k = Klass("smart member value"); m.SmartMemberValue = k; val = k.getValue(); verifyValue("smart member value", val) verifyCount(2, k) kmember = m.SmartMemberValue; val = kmember.getValue(); verifyValue("smart member value", val) verifyCount(3, kmember) verifyCount(3, k) clear m verifyCount(2, kmember) verifyCount(2, k) # smart pointer by pointer m = MemberVariables(); k = Klass("smart member pointer"); m.SmartMemberPointer = k; val = k.getValue(); verifyValue("smart member pointer", val) verifyCount(1, k) kmember = m.SmartMemberPointer; val = kmember.getValue(); verifyValue("smart member pointer", val) verifyCount(2, kmember) verifyCount(2, k) clear m verifyCount(2, kmember) verifyCount(2, k) # smart pointer by reference m = MemberVariables(); k = Klass("smart member reference"); m.SmartMemberReference = k; val = k.getValue(); verifyValue("smart member reference", val) verifyCount(2, k) kmember = m.SmartMemberReference; val = kmember.getValue(); verifyValue("smart member reference", val) verifyCount(3, kmember) verifyCount(3, k) # The C++ reference refers to SmartMemberValue... kmemberVal = m.SmartMemberValue; val = kmember.getValue(); verifyValue("smart member reference", val) verifyCount(4, kmemberVal) verifyCount(4, kmember) verifyCount(4, k) clear m verifyCount(3, kmemberVal) verifyCount(3, kmember) verifyCount(3, k) # plain by value m = MemberVariables(); k = Klass("plain member value"); m.MemberValue = k; val = k.getValue(); verifyValue("plain member value", val) verifyCount(1, k) kmember = m.MemberValue; val = kmember.getValue(); verifyValue("plain member value", val) verifyCount(1, kmember) verifyCount(1, k) clear m verifyCount(1, kmember) verifyCount(1, k) # plain by pointer m = MemberVariables(); k = Klass("plain member pointer"); m.MemberPointer = k; val = k.getValue(); verifyValue("plain member pointer", val) verifyCount(1, k) kmember = m.MemberPointer; val = kmember.getValue(); verifyValue("plain member pointer", val) verifyCount(1, kmember) verifyCount(1, k) clear m verifyCount(1, kmember) verifyCount(1, k) # plain by reference m = MemberVariables(); k = Klass("plain member reference"); m.MemberReference = k; val = k.getValue(); verifyValue("plain member reference", val) verifyCount(1, k) kmember = m.MemberReference; val = kmember.getValue(); verifyValue("plain member reference", val) verifyCount(1, kmember) verifyCount(1, k) clear m verifyCount(1, kmember) verifyCount(1, k) # null member variables m = MemberVariables(); # shared_ptr by value k = m.SmartMemberValue; #KTODO None not defined # if (k ~= None) # error("expected null") # end # m.SmartMemberValue = None # k = m.SmartMemberValue # if (k ~= None) # error("expected null") # end # verifyCount(0, k) # # plain by value # # try: # # m.MemberValue = None # # error("Failed to catch null pointer") # # except ValueError: # # pass # # ////////////////////////////////// Global variables //////////////////////////////////////// # # smart pointer # kglobal = cvar.GlobalSmartValue # if (kglobal ~= None) # error("expected null") # end k = Klass("smart global value"); cvar.GlobalSmartValue = k; verifyCount(2, k) kglobal = cvar.GlobalSmartValue; val = kglobal.getValue(); verifyValue("smart global value", val) verifyCount(3, kglobal) verifyCount(3, k) verifyValue("smart global value", cvar.GlobalSmartValue.getValue()) #KTTODO cvar.GlobalSmartValue = None # plain value k = Klass("global value"); cvar.GlobalValue = k; verifyCount(1, k) kglobal = cvar.GlobalValue; val = kglobal.getValue(); verifyValue("global value", val) verifyCount(1, kglobal) verifyCount(1, k) verifyValue("global value", cvar.GlobalValue.getValue()) # try: # cvar.GlobalValue = None # error("Failed to catch null pointer") # except ValueError: # pass # plain pointer kglobal = cvar.GlobalPointer; #KTODO if (kglobal ~= None) #KTODO error("expected null") #KTODO end k = Klass("global pointer"); cvar.GlobalPointer = k; verifyCount(1, k) kglobal = cvar.GlobalPointer; val = kglobal.getValue(); verifyValue("global pointer", val) verifyCount(1, kglobal) verifyCount(1, k) #KTODO cvar.GlobalPointer = None # plain reference k = Klass("global reference"); cvar.GlobalReference = k; verifyCount(1, k) kglobal = cvar.GlobalReference; val = kglobal.getValue(); verifyValue("global reference", val) verifyCount(1, kglobal) verifyCount(1, k) # try: # cvar.GlobalReference = None # error("Failed to catch null pointer") # except ValueError: # pass # ////////////////////////////////// Templates //////////////////////////////////////// pid = PairIntDouble(10, 20.2); if (pid.baseVal1 ~= 20 || pid.baseVal2 ~= 40.4) error("Base values wrong") end if (pid.val1 ~= 10 || pid.val2 ~= 20.2) error("Derived Values wrong") end endfunction debug = false;%true; if (debug) fprintf( "Started\n" ) end cvar.debug_shared = debug; # Change loop count to run for a long time to monitor memory loopCount = 1; #5000 for i=0:loopCount runtest() end # Expect 1 instance - the one global variable (GlobalValue) #KTTODO next fails, possibly because we commented GlobalSmartValue=None #if (Klass.getTotal_count() ~= 1) # error("Klass.total_count=%d", Klass.getTotal_count()) #end wrapper_count = shared_ptr_wrapper_count() ; #KTTODO next fails as NOT_COUNTING not in octave name space, so we hard-wire it here #if (wrapper_count ~= NOT_COUNTING) if (wrapper_count ~= -123456) # Expect 1 instance - the one global variable (GlobalSmartValue) if (wrapper_count ~= 1) error("shared_ptr wrapper count=%s", wrapper_count) end end if (debug) fprintf( "Finished\n" ) end