From: <bi...@us...> - 2007-04-02 16:18:40
|
Revision: 209 http://svn.sourceforge.net/oorexx/?rev=209&view=rev Author: bigrixx Date: 2007-04-02 09:18:40 -0700 (Mon, 02 Apr 2007) Log Message: ----------- [ 1668426 ] Add putAll() methods to non-ordered collections. [ 1668423 ] Add append methods to array, list, and queue Modified Paths: -------------- interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp interpreter-3.x/trunk/kernel/classes/ListClass.cpp interpreter-3.x/trunk/kernel/classes/ListClass.hpp interpreter-3.x/trunk/kernel/classes/QueueClass.cpp interpreter-3.x/trunk/kernel/classes/QueueClass.hpp interpreter-3.x/trunk/kernel/runtime/Setup.cpp Modified: interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx =================================================================== --- interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/RexxClasses/CoreClasses.orx 2007-04-02 16:18:40 UTC (rev 209) @@ -50,6 +50,23 @@ .kernel~objectname = "The kernel directory" .nil~objectname = "The NIL object" +say 'Adding appendAll method to ARRAY, LIST and QUEUE' +appendMethods = .table~new +appendMethods~put(.methods~ordered_appendall, 'APPENDALL') + +.array~!define_methods(appendMethods) +.list~!define_methods(appendMethods) +.queue~!define_methods(appendMethods) + +say 'Adding putAll methods to TABLE, DIRECTORY, and RELATION' +putMethods = .table~new +putMethods~put(.methods~collection_putall, 'PUTALL') + +.table~!define_methods(putMethods) +.directory~!define_methods(putMethods) +.relation~!define_methods(putMethods) + + say ('Adding setlike methods to table, relation, and directory') set_methods = .table~new /* get a table directory */ /* add the single item methods */ @@ -73,6 +90,9 @@ .table~!rexxdefined /* get changed by users */ .directory~!rexxdefined .relation~!rexxdefined +.array~!rexxdefined +.list~!rexxdefined +.queue~!rexxdefined /* Call the system dependant routine to define addition methods */ systemMethods = 'SystemMethods.orx'() /* case sensitive */ @@ -540,6 +560,41 @@ raise propagate /* just send on to the caller */ + +/*****************************************/ +/* APPENDALL method */ +/*****************************************/ +::method ordered_appendall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~append(supplier~item) -- appending the item + supplier~next + end + + + +/*****************************************/ +/* PUTALL method */ +/*****************************************/ +::method collection_putall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~put(supplier~item, supplier~index) -- putting the item using the same index + supplier~next + end + + + /* ******************************** */ /* S E R V E R M E T H O D S */ /* ******************************** */ Modified: interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx =================================================================== --- interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/RexxClasses/SystemObjects.orx 2007-04-02 16:18:40 UTC (rev 209) @@ -334,6 +334,23 @@ syntax: /* unknown method sent */ raise propagate /* just send on to the caller */ + +/*****************************************/ +/* PUTALL method */ +/*****************************************/ +::method putall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~put(supplier~item) -- set and bag only use the item, ignoring the index. + supplier~next + end + + /* *************************************** */ /* B A G C L A S S */ /* *************************************** */ @@ -482,6 +499,22 @@ syntax: /* unknown method sent */ raise propagate /* just send on to the caller */ + +/*****************************************/ +/* PUTALL method */ +/*****************************************/ +::method putall + use arg other + if (arg() < 1) /* no index given? */ + then raise syntax 93.901 array (1) /* raise an error */ + if (arg() > 1) /* too many arguments? */ + then raise syntax 93.902 array (1) /* raise an error */ + supplier = other~supplier /* get an other supplier */ + do while supplier~available /* loop over the other collection */ + self~put(supplier~item) -- set and bag only use the item, ignoring the index. + supplier~next + end + /* ******************************** */ /* A L A R M C L A S S */ /* ******************************** */ Modified: interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ArrayClass.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -194,6 +194,39 @@ return OREF_NULL; /* Make sure RESULT gets dropped */ } + +/** + * Append an item after the last item in the array. + * + * @param value The value to append. + * + * @return The index of the appended item. + */ +RexxObject *RexxArray::append(RexxObject *value) +{ + required_arg(value, ONE); + + RexxObject *lastIndex = lastRexx(); + + size_t newIndex; + + // empty array, so just insert at the first element + if (lastIndex == TheNilObject) + { + newIndex = 1; + } + else + { + // the index requires validation + newIndex = ((RexxInteger *)lastIndex)->value + 1; + } + + ensureSpace(newIndex); + put(value, newIndex); + return new_integer(newIndex); +} + + RexxObject *RexxArray::getRexx(RexxObject **arguments, size_t argCount) /******************************************************************************/ /* Function: Performs REXX-level gets from arrays. */ @@ -631,6 +664,30 @@ return position; /* return the position */ } + +/** + * Make sure that the array has been expanded to sufficient + * size for a primitive put operation. + * + * @param newSize The new required size. + */ +void RexxArray::ensureSpace(size_t newSize) +{ + /* out of bounds? */ + if (newSize > this->size()) + { + if (newSize >= MAX_FIXEDARRAY_SIZE) + { + report_exception(Error_Incorrect_method_array_too_big); + } + /* yes, compute amount to expand */ + this->extend(newSize - this->size()); + + } +} + + + RexxInteger *RexxArray::sizeRexx() /******************************************************************************/ /* Function: Return the array size as an integer object */ Modified: interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ArrayClass.hpp 2007-04-02 16:18:40 UTC (rev 209) @@ -98,6 +98,7 @@ RexxObject *putRexx(RexxObject **, size_t); RexxObject *remove(size_t); RexxObject *removeRexx(RexxObject **, size_t); + RexxObject *append(RexxObject *); void setExpansion(RexxObject * expansion); RexxInteger *available(size_t position); size_t validateIndex(RexxObject **, size_t, size_t, size_t); @@ -126,6 +127,7 @@ void insertItem(RexxObject *, size_t); RexxArray *extendMulti(RexxObject **, size_t, size_t); void resize(); + void ensureSpace(size_t newSize); RexxObject *newRexx(RexxObject **, size_t); RexxObject *of(RexxObject **, size_t); Modified: interpreter-3.x/trunk/kernel/classes/ListClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ListClass.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -453,6 +453,22 @@ return this->insert(value, index); } + +/** + * Append an item after the last item in the list. + * + * @param value The value to append. + * + * @return The index of the appended item. + */ +RexxObject *RexxList::append(RexxObject *value) +{ + required_arg(value, ONE); + // this is just an insertion operation with an ommitted index. + return insert(value, OREF_NULL); +} + + RexxObject *RexxList::insert( RexxObject *value, /* new value to add */ RexxObject *index) /* addition insertion index */ Modified: interpreter-3.x/trunk/kernel/classes/ListClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/ListClass.hpp 2007-04-02 16:18:40 UTC (rev 209) @@ -104,6 +104,7 @@ void addLast(RexxObject *value); void addFirst(RexxObject *value); inline long getSize() {return this->count;} + RexxObject *append(RexxObject *); RexxListTable *table; /* list table item */ long first; /* first real element index */ Modified: interpreter-3.x/trunk/kernel/classes/QueueClass.cpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/QueueClass.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/QueueClass.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -59,6 +59,7 @@ item = TheNilObject; /* use .nil instead */ return item; /* return the pulled item */ } + RexxObject *RexxQueue::pushRexx(RexxObject *item) /* item to push onto the queue */ /******************************************************************************/ @@ -71,6 +72,25 @@ return OREF_NULL; /* return nothing */ } + + +/** + * Append an item after the last item in the list. + * + * @param value The value to append. + * + * @return The index of the appended item. + */ +RexxObject *RexxQueue::append(RexxObject *item) +{ + + required_arg(item, ONE); /* make sure we have an argument */ + this->push(item); /* push onto the queue */ + // the insertion index is the position. + return new_integer(this->count); +} + + RexxObject *RexxQueue::queueRexx(RexxObject *item) /******************************************************************************/ /* Function: Push an item onto the queue */ Modified: interpreter-3.x/trunk/kernel/classes/QueueClass.hpp =================================================================== --- interpreter-3.x/trunk/kernel/classes/QueueClass.hpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/classes/QueueClass.hpp 2007-04-02 16:18:40 UTC (rev 209) @@ -36,7 +36,7 @@ /* */ /*----------------------------------------------------------------------------*/ /******************************************************************************/ -/* REXX Kernel QueueClass.hpp */ +/* REXX Kernel QueueClass.hpp */ /* */ /* Primitive Queue Class Definitions */ /* */ @@ -64,6 +64,7 @@ RexxObject *peek(); RexxObject *supplier(); RexxObject *newRexx(RexxObject **, size_t); + RexxObject *append(RexxObject *); inline RexxObject *pop() { return this->removeFirst();}; inline void push(RexxObject *obj) { this->addFirst(obj);}; Modified: interpreter-3.x/trunk/kernel/runtime/Setup.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-02 14:08:51 UTC (rev 208) +++ interpreter-3.x/trunk/kernel/runtime/Setup.cpp 2007-04-02 16:18:40 UTC (rev 209) @@ -153,6 +153,7 @@ CPPMA(RexxArray::lastRexx), CPPMA(RexxArray::nextRexx), CPPMA(RexxArray::previousRexx), +CPPMA(RexxArray::append), CPPMC1(RexxArray::newRexx), CPPMA(RexxArray::makeString), @@ -220,6 +221,7 @@ CPPML(RexxList::firstItem), CPPML(RexxList::lastItem), CPPML(RexxList::insertRexx), +CPPML(RexxList::append), CPPMLC(RexxListClass::newRexx), CPPMLC(RexxListClass::classOf), @@ -292,6 +294,7 @@ CPPMQ(RexxQueue::at), CPPMQ(RexxQueue::hasindex), CPPMQ(RexxQueue::remove), +CPPML(RexxQueue::append), CPPMQ(RexxQueue::newRexx), @@ -817,6 +820,7 @@ defineKernelMethod(CHAR_LAST ,TheArrayBehaviour, CPPMA(RexxArray::lastRexx), 0); defineKernelMethod(CHAR_NEXT ,TheArrayBehaviour, CPPMA(RexxArray::nextRexx), 1); defineKernelMethod(CHAR_PREVIOUS ,TheArrayBehaviour, CPPMA(RexxArray::previousRexx), 1); + defineKernelMethod(CHAR_APPEND ,TheArrayBehaviour, CPPMA(RexxArray::append), 1); defineKernelMethod(CHAR_MAKESTRING ,TheArrayBehaviour, CPPMA(RexxArray::makeString), 1); /*THU006*/ /* set the scope of the methods to */ /* this classes oref */ @@ -909,6 +913,7 @@ defineKernelMethod(CHAR_REMOVE ,TheListBehaviour, CPPML(RexxList::remove), 1); defineKernelMethod(CHAR_SECTION ,TheListBehaviour, CPPML(RexxList::section), 2); defineKernelMethod(CHAR_SUPPLIER ,TheListBehaviour, CPPML(RexxList::supplier), 0); + defineKernelMethod(CHAR_APPEND ,TheListBehaviour, CPPMA(RexxList::append), 1); /* set the scope of the methods to */ /* this classes oref */ TheListBehaviour->setMethodDictionaryScope(TheListClass); @@ -1009,6 +1014,7 @@ defineKernelMethod(CHAR_HASINDEX ,TheQueueBehaviour, CPPMQ(RexxQueue::hasindex), 1); defineKernelMethod(CHAR_PUT ,TheQueueBehaviour, CPPMQ(RexxQueue::put), 2); defineKernelMethod(CHAR_REMOVE ,TheQueueBehaviour, CPPMQ(RexxQueue::remove), 1); + defineKernelMethod(CHAR_APPEND ,TheQueueBehaviour, CPPMA(RexxQueue::append), 1); /* set the scope of the methods to */ /* this classes oref */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |