diff --git a/dw/fltkimgbuf.cc b/dw/fltkimgbuf.cc index b6252e6..a54fa22 100644 --- a/dw/fltkimgbuf.cc +++ b/dw/fltkimgbuf.cc @@ -152,9 +152,7 @@ void FltkImgbuf::init (Type type, int width, int height, double gamma, // The list is only used for root buffers. if (isRoot()) - scaledBuffers = new lout::container::typed::List (true); - else - scaledBuffers = NULL; + scaledBuffers.emplace(); if (!isRoot()) { // Scaling @@ -172,12 +170,11 @@ FltkImgbuf::~FltkImgbuf () if (!isRoot()) root->detachScaledBuf (this); + else for( auto &sb: scaledBuffers.value() ) delete sb; // FIXME: Manual management delete[] rawdata; delete copiedRows; - if (scaledBuffers) - delete scaledBuffers; DBG_OBJ_DELETE (); } @@ -188,12 +185,12 @@ FltkImgbuf::~FltkImgbuf () */ void FltkImgbuf::detachScaledBuf (FltkImgbuf *scaledBuf) { - scaledBuffers->detachRef (scaledBuf); + scaledBuffers.value().remove( scaledBuf ); _MSG("FltkImgbuf[root %p]: scaled buffer %p is detached, %d left\n", - this, scaledBuf, scaledBuffers->size ()); + this, scaledBuf, scaledBuffers.value().size()); - if (refCount == 0 && scaledBuffers->isEmpty () && deleteOnUnref) + if (refCount == 0 && scaledBuffers.value().empty () && deleteOnUnref) // If the root buffer is not used anymore, but this is the last scaled // buffer. // See also: FltkImgbuf::unref(). @@ -368,9 +365,7 @@ void FltkImgbuf::copyRow (int row, const core::byte *data) memcpy(rawdata + row * width * bpp, data, width * bpp); // Update all the scaled buffers of this root image. - for (Iterator it = scaledBuffers->iterator(); - it.hasNext(); ) { - FltkImgbuf *sb = it.getNext (); + for( auto &sb: scaledBuffers.value() ) { sb->scaleRow (row, data); } } @@ -379,8 +374,7 @@ void FltkImgbuf::copyRow (int row, const core::byte *data) void FltkImgbuf::newScan () { if (isRoot()) { - for (Iterator it = scaledBuffers->iterator(); it.hasNext();){ - FltkImgbuf *sb = it.getNext (); + for( auto &sb: scaledBuffers.value() ) { sb->copiedRows->clear(); DBG_IF_RTFL { @@ -412,8 +406,7 @@ core::Imgbuf* FltkImgbuf::getScaledBuf (int width, int height) return this; } - for (Iterator it = scaledBuffers->iterator(); it.hasNext(); ) { - FltkImgbuf *sb = it.getNext (); + for( auto &sb: scaledBuffers.value() ) { if (sb->width == width && sb->height == height) { sb->ref (); return sb; @@ -432,7 +425,7 @@ core::Imgbuf* FltkImgbuf::getScaledBuf (int width, int height) // This size is not yet used, so a new buffer has to be created. FltkImgbuf *sb = new FltkImgbuf (type, width, height, gamma, this); - scaledBuffers->append (sb); + scaledBuffers.value().push_back (sb); DBG_OBJ_ASSOC_CHILD (sb); return sb; @@ -532,11 +525,11 @@ void FltkImgbuf::unref () if (isRoot ()) { // Root buffer, it must be ensured that no scaled buffers are left. // See also FltkImgbuf::detachScaledBuf(). - if (scaledBuffers->isEmpty () && deleteOnUnref) { + if (scaledBuffers.value().empty () && deleteOnUnref) { delete this; } else { _MSG("FltkImgbuf[root %p]: not deleted. numScaled=%d\n", - this, scaledBuffers->size ()); + this, scaledBuffers.value().size ()); } } else // Scaled buffer buffer, simply delete it. @@ -547,7 +540,7 @@ void FltkImgbuf::unref () bool FltkImgbuf::lastReference () { return refCount == 1 && - (scaledBuffers == NULL || scaledBuffers->isEmpty ()); + ( scaledBuffers.has_value() == false || scaledBuffers.value().empty() ); } void FltkImgbuf::setDeleteOnUnref (bool deleteOnUnref) @@ -559,7 +552,7 @@ void FltkImgbuf::setDeleteOnUnref (bool deleteOnUnref) bool FltkImgbuf::isReferred () { return refCount != 0 || - (scaledBuffers != NULL && !scaledBuffers->isEmpty ()); + (scaledBuffers.has_value() and not scaledBuffers.value().empty()); } diff --git a/dw/fltkimgbuf.hh b/dw/fltkimgbuf.hh index 2ea3152..c3cc356 100644 --- a/dw/fltkimgbuf.hh +++ b/dw/fltkimgbuf.hh @@ -1,6 +1,9 @@ #ifndef __DW_FLTKIMGBUF_HH__ #define __DW_FLTKIMGBUF_HH__ +#include +#include + #ifndef __INCLUDED_FROM_DW_FLTK_CORE_HH__ # error Do not include this file directly, use "fltkcore.hh" instead. #endif @@ -21,7 +24,7 @@ private: FltkImgbuf *root; int refCount; bool deleteOnUnref; - lout::container::typed::List *scaledBuffers; + std::optional< std::list< FltkImgbuf * > > scaledBuffers; int width, height; Type type; diff --git a/dw/fltkplatform.cc b/dw/fltkplatform.cc index 53e7ae3..bd2543e 100644 --- a/dw/fltkplatform.cc +++ b/dw/fltkplatform.cc @@ -449,7 +449,6 @@ FltkPlatform::FltkPlatform () idleFuncId = 0; view = NULL; - resources = new container::typed::List (false); resourceFactory.setPlatform (this); } @@ -458,7 +457,6 @@ FltkPlatform::~FltkPlatform () { if (idleFuncRunning) Fl::remove_idle (generalStaticIdle, (void*)this); - delete resources; DBG_OBJ_DELETE (); } @@ -476,9 +474,7 @@ void FltkPlatform::attachView (core::View *view) MSG_ERR("FltkPlatform::attachView: multiple views!\n"); this->view = (FltkView*)view; - for (container::typed::Iterator it = - resources->iterator (); it.hasNext (); ) { - ui::FltkResource *resource = it.getNext (); + for( auto &resource: resources ) { resource->attachView (this->view); } } @@ -490,9 +486,7 @@ void FltkPlatform::detachView (core::View *view) MSG_ERR("FltkPlatform::detachView: this->view: %p view: %p\n", (void *) this->view, (void *) view); - for (container::typed::Iterator it = - resources->iterator (); it.hasNext (); ) { - ui::FltkResource *resource = it.getNext (); + for( auto &resource: resources ) { resource->detachView ((FltkView*)view); } this->view = NULL; @@ -699,13 +693,13 @@ core::ui::ResourceFactory *FltkPlatform::getResourceFactory () void FltkPlatform::attachResource (ui::FltkResource *resource) { - resources->append (resource); + resources.push_back( resource ); resource->attachView (view); } void FltkPlatform::detachResource (ui::FltkResource *resource) { - resources->removeRef (resource); + resources.remove( resource ); } } // namespace fltk diff --git a/dw/fltkplatform.hh b/dw/fltkplatform.hh index 134fadc..49a9240 100644 --- a/dw/fltkplatform.hh +++ b/dw/fltkplatform.hh @@ -140,7 +140,7 @@ private: void generalIdle(); FltkView *view; - lout::container::typed::List *resources; + std::list resources; public: FltkPlatform (); diff --git a/lout/container.cc b/lout/container.cc index 8b1ce00..a54b32f 100644 --- a/lout/container.cc +++ b/lout/container.cc @@ -292,154 +292,6 @@ Collection0::AbstractIterator* Vector::createIterator() return new VectorIterator(this); } -// ------------ -// List -// ------------ - -List::List(bool ownerOfObjects) -{ - this->ownerOfObjects = ownerOfObjects; - first = last = NULL; - numElements = 0; -} - -List::~List() -{ - clear(); -} - -int List::size () -{ - return numElements; -} - -bool List::equals(const Object *other) const -{ - List *otherList = (List*)other; - Node *node1 = first, *node2 = otherList->first; - while (node1 != NULL && node2 != NULL ) { - if (!node1->object->equals (node2->object)) - return false; - node1 = node1->next; - node2 = node2->next; - } - return node1 == NULL && node2 == NULL; -} - -int List::hashValue() -{ - int h = 0; - for (Node *node = first; node; node = node->next) - h = h ^ node->object->hashValue (); - return h; -} - -void List::clear() -{ - while (first) { - if (ownerOfObjects && first->object) - delete first->object; - Node *next = first->next; - delete first; - first = next; - } - - last = NULL; - numElements = 0; -} - -void List::append(Object *element) -{ - Node *newLast = new Node; - newLast->next = NULL; - newLast->object = element; - - if (last) { - last->next = newLast; - last = newLast; - } else - first = last = newLast; - - numElements++; -} - -bool List::insertBefore(object::Object *beforeThis, object::Object *neew) -{ - Node *beforeCur, *cur; - - for (beforeCur = NULL, cur = first; cur; beforeCur = cur, cur = cur->next) { - if (cur->object == beforeThis) { - Node *newNode = new Node; - newNode->next = cur; - newNode->object = neew; - - if (beforeCur) - beforeCur->next = newNode; - else - first = newNode; - - numElements++; - return true; - } - } - - return false; -} - -bool List::remove0(Object *element, bool compare, bool doNotDeleteAtAll) -{ - Node *beforeCur, *cur; - - for (beforeCur = NULL, cur = first; cur; beforeCur = cur, cur = cur->next) { - if (compare ? - (cur->object && element->equals(cur->object)) : - element == cur->object) { - if (beforeCur) { - beforeCur->next = cur->next; - if (cur->next == NULL) - last = beforeCur; - } else { - first = cur->next; - if (first == NULL) - last = NULL; - } - - if (ownerOfObjects && cur->object && !doNotDeleteAtAll) - delete cur->object; - delete cur; - - numElements--; - return true; - } - } - - return false; -} - -Object *List::ListIterator::getNext() -{ - Object *object; - - if (current) { - object = current->object; - current = current->next; - } else - object = NULL; - - return object; -} - -bool List::ListIterator::hasNext() -{ - return current != NULL; -} - -Collection0::AbstractIterator* List::createIterator() -{ - return new ListIterator(first); -} - - // --------------- // HashSet // ---------------