- Timestamp:
- 10/01/21 23:40:49 (3 years ago)
- Location:
- cpp
- Files:
-
- 13 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
cpp/common/threads.h
r665 r1158 27 27 pthread_key_t mt_key; 28 28 bool destroyed; 29 29 30 30 public: 31 31 … … 33 33 { 34 34 pthread_key_create(&mt_key, &destructor); 35 destroyed =false;35 destroyed = false; 36 36 } 37 37 … … 40 40 T* o = set(NULL); 41 41 if (o) delete o; 42 destroyed =true;42 destroyed = true; 43 43 } 44 44 … … 114 114 T *object; 115 115 public: 116 ThreadSingletonPtr() :object(NULL) {}117 T* get() { return object;}118 T* setptr(T* o) { T* previous=object; object=o; return previous;}116 ThreadSingletonPtr() :object(NULL) {} 117 T* get() { return object; } 118 T* setptr(T* o) { T* previous = object; object = o; return previous; } 119 119 }; 120 120 … … 139 139 { 140 140 if (!var) 141 var =new T();141 var = new T(); 142 142 return var; 143 143 } … … 151 151 #define tlsGetRef(var) (*_tlsGet(ThreadLocal_ ## var)) 152 152 153 template<class T> T* _tlsSet(T*& var, T* new_o)153 template<class T> T* _tlsSet(T*& var, T* new_o) 154 154 { 155 T* o =var;156 var =new_o;155 T* o = var; 156 var = new_o; 157 157 return o; 158 158 } -
cpp/frams/Makefile-SDK
r1035 r1158 11 11 CXXWARNINGS=-Wall -Wno-parentheses -Wno-overloaded-virtual -Wno-format -Werror=return-type 12 12 13 SDK_BUILD_CONFIG= -include frams/config/sdk _build_config.h13 SDK_BUILD_CONFIG= -include frams/config/sdk-build-config.h 14 14 CXXFLAGS= -I$(CURDIR) -std=gnu++17 $(SDK_BUILD_CONFIG) $(CXXWARNINGS) -g 15 15 -
cpp/frams/frams-objects.h
r1123 r1158 25 25 EXPORTED char* extPropId(void *v, int i); 26 26 EXPORTED char* extPropType(void *v, int i); 27 EXPORTED char* extPropName(void *v, int i); 28 EXPORTED int extPropFlags(void *v, int i); 29 EXPORTED int extPropGroup(void *v, int i); 30 EXPORTED char* extPropHelp(void *v, int i); 27 31 EXPORTED int extPropFind(void *v, char* id); 28 32 EXPORTED void* extPropGet(void *v, int i); 29 33 EXPORTED int extPropSet(void *v, int i, void* e); 30 34 EXPORTED void* extPropCall(void *v, int i, int argc, void* argv); 35 EXPORTED int extGroupCount(void *v); 36 EXPORTED char* extGroupName(void *v, int i); 37 EXPORTED int extGroupMember(void *v, int g, int i); 38 EXPORTED int extMemberCount(void *v, int g); 31 39 EXPORTED void* rootObject(); 32 40 -
cpp/frams/genetics/fS/fS_general.h
r1032 r1158 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 2019-202 0Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 2019-2021 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 … … 11 11 #include <unordered_map> 12 12 #include <exception> 13 #include <algorithm> 13 14 #include "frams/model/model.h" 14 15 #include "frams/util/multirange.h" -
cpp/frams/model/geometry/modelgeoclass.cpp
r1115 r1158 18 18 "To set geom_density for individual ModelGeometry objects:\n" 19 19 "var mg=ModelGeometry.forModel(GenePools[0][0].getModel()); mg.geom_density=2; GenePools[0][0].data->area=mg.area();\n" }, 20 { "geom_density", 0, 0, "Density", "f 0.01 100.0 1.0", FIELD(density), "The number of samples (per unit length in one dimension) that affects the precision of estimation of geometrical properties." }, //note: we used 'geom_density' instead of 'density' to make the name more unique - because sim_params merges all configuration fields in a single namespace.20 { "geom_density", 0, 0, "Density", "f 0.01 100.0 3.0", FIELD(density), "The number of samples (per unit length in one dimension) that affects the precision of estimation of geometrical properties." }, //Note #1: we used 'geom_density' instead of 'density' to make the name more unique - because sim_params merges all configuration fields in a single namespace. Note #2: "density" needs better, more interpretable and more reliable parametrization for surface sampling... 21 21 { "forModel", 0, PARAM_USERHIDDEN, "", "p oModelGeometry(oModel)", PROCEDURE(p_formodel), "The returned ModelGeometry object can be used to calculate geometric properties (volume, area, sizes) of the associated model. The density is copied from the current global ModelGeometry.geom_density on object creation." }, 22 22 { "volume", 0, PARAM_NOSTATIC | PARAM_USERHIDDEN, "volume", "p f()", PROCEDURE(p_volume), }, -
cpp/frams/model/modelobj.cpp
r999 r1158 21 21 { "numconnections", 0, PARAM_DONTSAVE | PARAM_NOSTATIC | PARAM_READONLY, "Number of neuron connections", "d", GETONLY(numconnections), }, 22 22 23 { "getPart", 0, PARAM_ USERHIDDEN | PARAM_NOSTATIC, "getPart (static model information)", "p oPart(d index)", PROCEDURE(p_getpart), },24 { "getJoint", 0, PARAM_ USERHIDDEN | PARAM_NOSTATIC, "getJoint (static model information)", "p oJoint(d index)", PROCEDURE(p_getjoint), },25 { "getNeuroDef", 0, PARAM_ USERHIDDEN | PARAM_NOSTATIC, "getNeuroDef", "p oNeuroDef(d index)", PROCEDURE(p_getneuro), },23 { "getPart", 0, PARAM_READONLY | PARAM_USERHIDDEN | PARAM_NOSTATIC, "getPart (static model information)", "p oPart(d index)", PROCEDURE(p_getpart), }, 24 { "getJoint", 0, PARAM_READONLY | PARAM_USERHIDDEN | PARAM_NOSTATIC, "getJoint (static model information)", "p oJoint(d index)", PROCEDURE(p_getjoint), }, 25 { "getNeuroDef", 0, PARAM_READONLY | PARAM_USERHIDDEN | PARAM_NOSTATIC, "getNeuroDef", "p oNeuroDef(d index)", PROCEDURE(p_getneuro), }, 26 26 27 27 { "size_x", 0, PARAM_READONLY | PARAM_NOSTATIC | PARAM_DEPRECATED, "Bounding box x size", "f", FIELD(size.x), "(size_x,size_y,size_z) are dimensions of the axis-aligned bounding box of the creature, including imaginary Part sizes (Part.s, usually 1.0). A creature consisting of a single default part has the size of (2.0,2.0,2.0) - twice the Part.s value (like a sphere diameter is twice its radius).\nSee also: Creature.moveAbs" }, … … 30 30 { "bboxSize", 0, PARAM_READONLY | PARAM_NOSTATIC, "Bounding box size", "oXYZ", GETONLY(bboxsize) }, 31 31 { "numcheckpoints", 0, PARAM_DONTSAVE | PARAM_READONLY | PARAM_NOSTATIC, "Number of checkpoints", "d", GETONLY(numcheckpoints) }, 32 { "getCheckpoint", 0, PARAM_ USERHIDDEN | PARAM_NOSTATIC, "getCheckpoint", "p oModel(d index)", PROCEDURE(p_getcheckpoint),32 { "getCheckpoint", 0, PARAM_READONLY | PARAM_USERHIDDEN | PARAM_NOSTATIC, "getCheckpoint", "p oModel(d index)", PROCEDURE(p_getcheckpoint), 33 33 "Checkpoint Model objects are only valid as long as the parent Model object exists.\n" 34 34 "See also: Model.newWithCheckpoints()\n\n" -
cpp/frams/model/similarity/measure-greedy.cpp
r1073 r1158 1 1 // This file is a part of Framsticks SDK. http://www.framsticks.com/ 2 // Copyright (C) 1999-202 0Maciej Komosinski and Szymon Ulatowski.2 // Copyright (C) 1999-2021 Maciej Komosinski and Szymon Ulatowski. 3 3 // See LICENSE.txt for details. 4 4 5 5 #include "measure-greedy.h" 6 #include <cstdlib> //std::qsort() 6 7 #include <assert.h> 7 8 -
cpp/frams/neuro/impl/neuroimpl-fuzzy.cpp
r1130 r1158 5 5 #include "neuroimpl-fuzzy.h" 6 6 #include "neuroimpl-fuzzy-f0.h" 7 #include <algorithm> 7 8 8 9 int NI_FuzzyNeuro::countOuts(const Model *m, const Neuro *fuzzy) -
cpp/frams/util/extvalue.h
r1130 r1158 43 43 class ExtObject 44 44 { 45 int subtype; //< 0/1=Generic/DPC Object, 0/2=Standalone/Shared Param 45 int subtype; //< 0/1=Generic/DPC Object, 0/2=Standalone/Shared Param, 0/4=RW/Readonly 46 46 void incref() const; 47 47 void decref() const; … … 73 73 void setEmpty() { decref(); subtype = 0; param = NULL; object = NULL; } 74 74 int isEmpty() const { return !param; } 75 bool isReadonly() const {return (subtype&4)!=0;} 76 void setReadonly(bool ro) {subtype=(subtype&~4)|(ro?4:0);} 75 77 static const ExtObject& empty() { static const ExtObject e((ParamInterface*)NULL); return e; } 76 78 ExtObject(const ExtObject& src) { DEBUG_EXTOBJECT("(const&)"); src.incref(); copyFrom(src); } … … 188 190 void setInvalid() { setEmpty(); type = TInvalid; } 189 191 void setError(const SString& msg); 192 bool isReadonly() const {return (type==TObj) && odata().isReadonly();} 193 void setReadonly(bool ro) {if (type==TObj) odata().setReadonly(ro);} 190 194 bool makeUnique() { return (type == TObj) && odata().makeUnique(); } //< @return false if nothing has changed 191 195 ExtPType getType() const { return type; } -
cpp/frams/vm/classes/3dobject.cpp
r951 r1158 20 20 { "new", 0, 0, "create new XYZ object", "p oXYZ(f x,f y,f z)", PROCEDURE(p_new), "3D vectors objects can be also created using the (x,y,z) notation, i.e. var v=(1,2,3) is the same as var v=XYZ.new(1,2,3);", }, 21 21 { "newFromVector", 0, 0, "create new XYZ object", "p oXYZ(oVector)", PROCEDURE(p_newFromVector), "used for deserialization" }, 22 { "clone", 0, PARAM_ NOSTATIC, "create new XYZ object copying the coordinates", "p oXYZ()", PROCEDURE(p_clone), "Note: copying object references does not create new objects. Use clone() if a new object is needed.\n\nExample:\nvar o1=(1,2,3), o2=o1, o3=o1.clone();\no1.y=9999;\n//o2 is now (1,9999,3) but o3 is still (1,2,3)", },22 { "clone", 0, PARAM_READONLY | PARAM_NOSTATIC, "create new XYZ object copying the coordinates", "p oXYZ()", PROCEDURE(p_clone), "Note: copying object references does not create new objects. Use clone() if a new object is needed.\n\nExample:\nvar o1=(1,2,3), o2=o1, o3=o1.clone();\no1.y=9999;\n//o2 is now (1,9999,3) but o3 is still (1,2,3)", }, 23 23 { "set", 0, PARAM_NOSTATIC, "set (copy) coordinates from another XYZ object", "p(oXYZ)", PROCEDURE(p_set), }, 24 24 { "set3", 0, PARAM_NOSTATIC, "set individual 3 coordinates", "p(f x,f y,f z)", PROCEDURE(p_set3), }, … … 32 32 { "rotate", 0, PARAM_NOSTATIC, "rotate using Orient object", "p(oOrient)", PROCEDURE(p_rotate), }, 33 33 { "revRotate", 0, PARAM_NOSTATIC, "reverse rotate using Orient object", "p(oOrient)", PROCEDURE(p_revrotate), }, 34 { "get", 0, PARAM_ NOSTATIC, "get one of coordinates", "p f(d index)", PROCEDURE(p_get), "this function makes the XYZ objects \"indexable\" (so you can use [] for accessing subsequent fields, like in Vector)", },34 { "get", 0, PARAM_READONLY | PARAM_NOSTATIC, "get one of coordinates", "p f(d index)", PROCEDURE(p_get), "this function makes the XYZ objects \"indexable\" (so you can use [] for accessing subsequent fields, like in Vector)", }, 35 35 { 0, 0, 0, }, 36 36 }; -
cpp/frams/vm/classes/collectionobj.cpp
r1130 r1158 31 31 { "size", 0, PARAM_READONLY | PARAM_NOSTATIC, "Element count", "d", GETONLY(size), }, 32 32 { "remove", 0, PARAM_NOSTATIC, "Remove at position", "p(d position)", PROCEDURE(p_remove), }, 33 { "get", 0, PARAM_ NOSTATIC, "Get value at position", "p x(d position)", PROCEDURE(p_get), "object[position] can be always used instead of object.get(position)" },33 { "get", 0, PARAM_READONLY | PARAM_NOSTATIC, "Get value at position", "p x(d position)", PROCEDURE(p_get), "object[position] can be always used instead of object.get(position)" }, 34 34 { "set", 0, PARAM_NOSTATIC, "Set value at position", "p(d position,x value)", PROCEDURE(p_set), "object[position]=value can be always used instead of object.set(position,value)" }, 35 35 { "insert", 0, PARAM_NOSTATIC, "Insert value at position", "p(d position,x value)", PROCEDURE(p_insert), }, 36 36 { "add", 0, PARAM_NOSTATIC, "Append at the end", "p(x value)", PROCEDURE(p_add), }, 37 { "find", 0, PARAM_ NOSTATIC, "Find", "p d(x value)", PROCEDURE(p_find), "returns the element index or -1 if not found" },37 { "find", 0, PARAM_READONLY | PARAM_NOSTATIC, "Find", "p d(x value)", PROCEDURE(p_find), "returns the element index or -1 if not found" }, 38 38 { "avg", 0, PARAM_READONLY | PARAM_NOSTATIC, "Average", "x", GETONLY(avg) }, 39 39 { "stdev", 0, PARAM_READONLY | PARAM_NOSTATIC, "Standard deviation", "x", GETONLY(stdev), "=sqrt(sum((element[i]-avg)^2)/(size-1)) which is estimated population std.dev. from sample std.dev." }, … … 42 42 { "sort", 0, PARAM_NOSTATIC, "Sort elements (in place)", "p(oFunctionReference comparator)", PROCEDURE(p_sort), "comparator can be null, giving the \"natural\" sorting order (depending on element type), otherwise it must be a function reference obtained from the 'function' operator.\n\nExample:\nfunction compareLastDigit(a,b) {return (a%10)<(b%10);}\nvar v=[16,23,35,42,54,61];\nv.sort(function compareLastDigit);" }, 43 43 { "iterator", 0, PARAM_NOSTATIC | PARAM_READONLY, "Iterator", "o", GETONLY(iterator), }, 44 { "clone", 0, PARAM_ NOSTATIC, "Create a clone", "p oVector()", PROCEDURE(p_clone), "The resulting clone is a shallow copy (contains the same object references as the original). A deep copy can be obtained through serialization: String.deserialize(String.serialize(object));" },44 { "clone", 0, PARAM_READONLY | PARAM_NOSTATIC, "Create a clone", "p oVector()", PROCEDURE(p_clone), "The resulting clone is a shallow copy (contains the same object references as the original). A deep copy can be obtained through serialization: String.deserialize(String.serialize(object));" }, 45 45 { 0, 0, 0, }, 46 46 }; … … 72 72 { "size", 0, PARAM_NOSTATIC | PARAM_READONLY, "Element count", "d", GETONLY(size), }, 73 73 { "remove", 0, PARAM_NOSTATIC, "Remove", "p(x key)", PROCEDURE(p_remove), "Removes the named or indexed element (depending on the argument type: string or int)." }, 74 { "get", 0, PARAM_ NOSTATIC, "Get element", "p x(x key)", PROCEDURE(p_get), "Retrieves the named or indexed element (depending on the argument type: string or int). Accessing nonexistent keys is an error (use hasKey() if necessary).\nobject.get(key) can be shortened to object[key]." },75 { "getKey", 0, PARAM_ NOSTATIC, "Get a key", "p s(d index)", PROCEDURE(p_getKey), "Returns the key of the indexed element (0 <= index < size)." },76 { "hasKey", 0, PARAM_ NOSTATIC, "Check if key exists", "p d(s key)", PROCEDURE(p_hasKey), "Returns 1 (interpreted as true) if dictionary contains the supplied key, or 0 (false) otherwise.\nExample:\n if (obj.hasKey(\"a\"))\n x = obj->a;" },74 { "get", 0, PARAM_READONLY | PARAM_NOSTATIC, "Get element", "p x(x key)", PROCEDURE(p_get), "Retrieves the named or indexed element (depending on the argument type: string or int). Accessing nonexistent keys is an error (use hasKey() if necessary).\nobject.get(key) can be shortened to object[key]." }, 75 { "getKey", 0, PARAM_READONLY | PARAM_NOSTATIC, "Get a key", "p s(d index)", PROCEDURE(p_getKey), "Returns the key of the indexed element (0 <= index < size)." }, 76 { "hasKey", 0, PARAM_READONLY | PARAM_NOSTATIC, "Check if key exists", "p d(s key)", PROCEDURE(p_hasKey), "Returns 1 (interpreted as true) if dictionary contains the supplied key, or 0 (false) otherwise.\nExample:\n if (obj.hasKey(\"a\"))\n x = obj->a;" }, 77 77 { "set", 0, PARAM_NOSTATIC, "Set element", "p x(x key,x value)", PROCEDURE(p_set), "Set element value for the specified key or index (depending on the argument type: string or int).\n" 78 78 "Returns the value previously associated with the given key (or index).\n" … … 81 81 " var old_value=object.set(\"key\",new_value); //'old_value' gets the value previously associated with \"key\"\n" 82 82 " var x=object[\"key\"]=new_value; //'x' becomes 'new_value', consistently with the semantics of the assignment operator. The value previously associated with \"key\" is lost." }, 83 { "find", 0, PARAM_ NOSTATIC, "Find", "p x(x value)", PROCEDURE(p_find), "Returns the element key or null if not found." },83 { "find", 0, PARAM_READONLY | PARAM_NOSTATIC, "Find", "p x(x value)", PROCEDURE(p_find), "Returns the element key or null if not found." }, 84 84 { "new", 0, 0, "Create a Dictionary", "p oDictionary()", STATICPROCEDURE(p_new), "Empty directory can be also created using the {} expression." }, 85 85 { "toString", 0, PARAM_READONLY | PARAM_NOSTATIC, "Textual form", "s", GETONLY(toString), }, 86 { "clone", 0, PARAM_ NOSTATIC, "Create a clone", "p oDictionary()", PROCEDURE(p_clone), "The resulting clone is a shallow copy (contains the same object references as the original). A deep copy can be obtained through serialization: String.deserialize(String.serialize(object));" },86 { "clone", 0, PARAM_READONLY | PARAM_NOSTATIC, "Create a clone", "p oDictionary()", PROCEDURE(p_clone), "The resulting clone is a shallow copy (contains the same object references as the original). A deep copy can be obtained through serialization: String.deserialize(String.serialize(object));" }, 87 87 { "assign", 0, PARAM_NOSTATIC, "Assign from another object", "p(x)", PROCEDURE(p_assign), "Replaces current dictionary with dictionary contents from another object." }, 88 88 { "iterator", 0, PARAM_NOSTATIC | PARAM_READONLY, "Iterator", "o", GETONLY(iterator), }, … … 99 99 100 100 VectorObject::VectorObject(Pt3D &pt) 101 : readonly(0),owndata(1)101 :owndata(1) 102 102 { 103 103 set_or_insert(0, ExtValue(pt.x), false); … … 119 119 void VectorObject::p_remove(PARAMPROCARGS) 120 120 { 121 if (readonly) return;122 121 int i = args->getInt(); 123 122 if (!listIndexCheck(&data, i, "VectorObject", "remove")) return; … … 270 269 VMachine *vm; 271 270 VMVEComparator(VMachine::JumpTargetObject *_jto) :jto(_jto), vm(jto->vm) {} 272 #ifdef QSORT_R_ USING_QSORT_S271 #ifdef QSORT_R_THIS_FIRST 273 272 static int compare(void* _this, const void *a, const void *b); 274 273 bool operator()(const ExtValue *a, const ExtValue *b) { return compare(this,&a,&b) == ExtValue::ResultLower; } … … 279 278 }; 280 279 281 #ifdef QSORT_R_ USING_QSORT_S280 #ifdef QSORT_R_THIS_FIRST 282 281 int VMVEComparator::compare(void* _this, const void *a, const void *b) 283 282 #else … … 324 323 std::sort(first, first + data.size(), cmp); //no qsort_r() or equivalent on Android (yet) 325 324 #else 326 qsort_r(first, data.size(), sizeof(ExtValue*), cmp.compare, &cmp);325 CALL_QSORT_R(first, data.size(), sizeof(ExtValue*), cmp.compare, &cmp); 327 326 #endif 328 327 } -
cpp/frams/vm/classes/collectionobj.h
r929 r1158 16 16 public: 17 17 SList data; 18 unsigned int readonly : 1,owndata : 1;18 unsigned int owndata : 1; 19 19 void clear(); 20 20 ExtValue *get(int i) { return (ExtValue*)data.get(i); } … … 24 24 static Param par; 25 25 VectorObject(Pt3D& pt); 26 VectorObject() : readonly(0),owndata(1) {}26 VectorObject() :owndata(1) {} 27 27 ~VectorObject() { clear(); } 28 28 static Param& getStaticParam() { return par; } 29 29 #define STATRICKCLASS VectorObject 30 PARAMPROCDEF(p_clear) { if (readonly) return;clear(); }30 PARAMPROCDEF(p_clear) { clear(); } 31 31 PARAMGETDEF(size) { arg1->setInt(data.size()); } 32 32 PARAMGETDEF(avg); … … 36 36 PARAMPROCDEF(p_get); 37 37 PARAMPROCDEF(p_find); 38 PARAMPROCDEF(p_set) { if (!readonly)set_or_insert(arg1[1].getInt(), arg1[0], false); }39 PARAMPROCDEF(p_add) { if (readonly) return; /*ExtValue tmp; get_toString(&tmp); printf("%s += %s",(const char*)tmp.getString(),(const char*)arg1[0].getString());*/ data += new ExtValue(arg1[0]); /*get_toString(&tmp); printf(" -> %s\n",(const char*)tmp.getString());*/arg2->setInt(data.size() - 1); }40 PARAMPROCDEF(p_insert) { if (!readonly)set_or_insert(arg1[1].getInt(), arg1[0], true); }38 PARAMPROCDEF(p_set) { set_or_insert(arg1[1].getInt(), arg1[0], false); } 39 PARAMPROCDEF(p_add) { data += new ExtValue(arg1[0]); arg2->setInt(data.size() - 1); } 40 PARAMPROCDEF(p_insert) { set_or_insert(arg1[1].getInt(), arg1[0], true); } 41 41 PARAMGETDEF(toString); 42 42 PARAMPROCDEF(p_sort); -
cpp/frams/vm/classes/genoobj.cpp
r999 r1158 23 23 "-1 = validity is not known. This is a transient state. The value of \"is_valid\" will never be -1 when read. It is safe to treat is_valid as boolean in statements like \"if (g.is_valid) ...\". Setting \"is_valid=-1\" will make it 0 or 1 again. This third state (-1) is only needed for loading Genotype objects from files where the \"is_valid\" field might not be present." 24 24 }, 25 { "getConverted", 0, PARAM_ NOSTATIC, "Get converted genotype", "p oGeno(s format)", PROCEDURE(p_getconvert), },26 { "getConvertedWithCheckpoints", 0, PARAM_ NOSTATIC, "Get converted genotype", "p oGeno(s format)", PROCEDURE(p_getconvert_ch), "See also Model.newWithCheckpoints()" },25 { "getConverted", 0, PARAM_READONLY | PARAM_NOSTATIC, "Get converted genotype", "p oGeno(s format)", PROCEDURE(p_getconvert), }, 26 { "getConvertedWithCheckpoints", 0, PARAM_READONLY | PARAM_NOSTATIC, "Get converted genotype", "p oGeno(s format)", PROCEDURE(p_getconvert_ch), "See also Model.newWithCheckpoints()" }, 27 27 { "f0genotype", 0, PARAM_NOSTATIC | PARAM_READONLY, "f0 genotype", "s 1", GETONLY(f0genotype), "converted to f0 genotype", }, 28 28 { "new", 0, 0, "create new empty object", "p oGeno()", PROCEDURE(p_new), },
Note: See TracChangeset
for help on using the changeset viewer.