#include "unrefqueue.hpp"

#include <components/sceneutil/workqueue.hpp>

namespace SceneUtil
{
    namespace
    {
        struct ClearVector final : SceneUtil::WorkItem
        {
            std::vector<osg::ref_ptr<osg::Referenced>> mObjects;

            explicit ClearVector(std::vector<osg::ref_ptr<osg::Referenced>>&& objects)
                : mObjects(std::move(objects))
            {
            }

            void doWork() override { mObjects.clear(); }
        };
    }

    void UnrefQueue::flush(SceneUtil::WorkQueue& workQueue)
    {
        if (mObjects.empty())
            return;

        // Move only objects to keep allocated storage in mObjects
        workQueue.addWorkItem(new ClearVector(std::vector<osg::ref_ptr<osg::Referenced>>(
            std::move_iterator(mObjects.begin()), std::move_iterator(mObjects.end()))));
        mObjects.clear();
    }
}