From: <bi...@us...> - 2007-04-10 19:05:27
|
Revision: 255 http://svn.sourceforge.net/oorexx/?rev=255&view=rev Author: bigrixx Date: 2007-04-10 12:05:28 -0700 (Tue, 10 Apr 2007) Log Message: ----------- [ 1697842 ] Add allItems() and allIndexes() methods to collections. (stem class only) [ 1697836 ] Add a supplier method to the stem class. Modified Paths: -------------- interpreter-3.x/trunk/kernel/classes/StemClass.cpp interpreter-3.x/trunk/kernel/classes/StemClass.hpp interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp interpreter-3.x/trunk/kernel/runtime/RexxCore.h interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/classes/StemClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StemClass.cpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/classes/StemClass.cpp 2007-04-10 19:05:28 UTC (rev 255) @@ -638,6 +638,101 @@ } +/** + * Return all items in the stem. + * + * @return An array of all items in the stem. + */ +RexxArray *RexxStem::allItems() +{ + // first, run the tree and get a count of the real items contained here + arraysize_t count = 0; + RexxCompoundElement *variable = tails.first(); + while (variable != OREF_NULL) + { + // we only want to include the non-dropped compounds, so we only count + // elements with real values. + if (variable->getVariableValue() != OREF_NULL) + { + count++; + } + // and keep iterating + variable = tails.next(variable); + } + // now we know how big the return result will be, get an array and + // populate it, using the same traversal logic as before + RexxArray *array = new_array(count); + // we index the array with a origin-one index, so we start with one this time + count = 1; + + variable = tails.first(); + while (variable != OREF_NULL) + { + // only add the real values + if (variable->getVariableValue() != OREF_NULL) + { + array->put(variable->getVariableValue(), count++); + } + variable = tails.next(variable); + } + return array; // tada, finished +} + + +/** + * Create an array of all indexes of the stem. + * + * @return An array of all tail names used in the stem. + */ +RexxArray *RexxStem::allIndexes() +{ + return this->tailArray(); /* extract the array item */ +} + + +/** + * Create a supplier for the stem, returning the tail names as + * the indexes and the values as the items. + * + * @return A supplier instance. + */ +RexxSupplier *RexxStem::supplier() +{ + // essentially the same logic as allItems(), but both the item and the + // tail value are accumulated. + arraysize_t count = 0; + RexxCompoundElement *variable = tails.first(); + while (variable != OREF_NULL) + { + // again, get the variable count + if (variable->getVariableValue() != OREF_NULL) + { + count++; /* count this variable */ + } + variable = tails.next(variable); + } + + // to create the supplier, we need 2 arrays + RexxArray *tailValues = new_array(count); + RexxArray *values = new_array(count); + count = 1; // we fill in using 1-based indexes + + variable = tails.first(); + while (variable != OREF_NULL) + { + // now grab both the tail and value and put them in the respective arrays + if (variable->getVariableValue() != OREF_NULL) + { + tailValues->put(variable->getName(), count); + values->put(variable->getVariableValue(), count++); + } + variable = tails.next(variable); + } + // two arrays become one supplier + return new_supplier(values, tailValues); +} + + /******************************************************************************/ /* Function: Below are a series of comparison routines used by the qsort() */ /* library function when sorting stems. */ Modified: interpreter-3.x/trunk/kernel/classes/StemClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/StemClass.hpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/classes/StemClass.hpp 2007-04-10 19:05:28 UTC (rev 255) @@ -74,6 +74,9 @@ RexxInteger *integerValue(size_t); RexxString *stringValue(); RexxArray *makeArray(); + RexxArray *allItems(); + RexxArray *allIndexes(); + RexxSupplier *supplier(); RexxObject *request(RexxString *); void dropValue(); Modified: interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/runtime/RexxConstants.hpp 2007-04-10 19:05:28 UTC (rev 255) @@ -65,6 +65,8 @@ CHARCONSTANT(ADDITIONAL, "ADDITIONAL"); CHARCONSTANT(ALLAT, "ALLAT"); CHARCONSTANT(ALLINDEX, "ALLINDEX"); +CHARCONSTANT(ALLINDEXES, "ALLINDEXES"); +CHARCONSTANT(ALLITEMS, "ALLITEMS"); CHARCONSTANT(ANY, "ANY"); CHARCONSTANT(APPEND, "APPEND"); CHARCONSTANT(ARRAY, "ARRAY"); Modified: interpreter-3.x/trunk/kernel/runtime/RexxCore.h =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/runtime/RexxCore.h 2007-04-10 19:05:28 UTC (rev 255) @@ -271,6 +271,7 @@ typedef size_t stringsize_t; typedef int wholenumber_t; typedef unsigned char stringchar_t; +typedef size_t arraysize_t; class ACTIVATION_SETTINGS { /* activation "global" settings */ Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 17:10:41 UTC (rev 254) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-10 19:05:28 UTC (rev 255) @@ -303,6 +303,9 @@ CPPMSTEM(RexxStem::bracket), /* Stem methods */ CPPMSTEM(RexxStem::bracketEqual), CPPMSTEM(RexxStem::request), +CPPMSTEM(RexxStem::supplier), +CPPMSTEM(RexxStem::allIndexes), +CPPMSTEM(RexxStem::allItems), CPPMSTEM(RexxStem::newRexx), @@ -1092,6 +1095,9 @@ defineKernelMethod(CHAR_BRACKETSEQUAL ,TheStemBehaviour, CPPMSTEM(RexxStem::bracketEqual), A_COUNT); defineKernelMethod(CHAR_MAKEARRAY ,TheStemBehaviour, CPPM(RexxObject::makeArrayRexx), 0); defineKernelMethod(CHAR_REQUEST ,TheStemBehaviour, CPPMSTEM(RexxStem::request), 1); + defineKernelMethod(CHAR_SUPPLIER ,TheStemBehaviour, CPPMSTEM(RexxStem::supplier), 0); + defineKernelMethod(CHAR_ALLINDEXES ,TheStemBehaviour, CPPMSTEM(RexxStem::allIndexes), 0); + defineKernelMethod(CHAR_ALLITEMS ,TheStemBehaviour, CPPMSTEM(RexxStem::allItems), 0); defineKernelMethod(CHAR_UNKNOWN ,TheStemBehaviour, CPPM(RexxObject::unknownRexx), 2); /* set the scope of the methods to */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |