// SPDX-License-Identifier: LGPL-2.1-only // Copyright (C) 2021 James Hogan #ifndef OSGXR_FRAME_STAMPED_VECTOR #define OSGXR_FRAME_STAMPED_VECTOR 1 #include #include #include #include namespace osgXR { /** * Manages frame stamping of vector items. * Contains a vector of the chosen type, with each item stamped with a * FrameStamp. Items can be retrieved by index or FrameStamp. */ template class FrameStampedVector { public: typedef T Item; typedef unsigned int FrameNumber; typedef const osg::FrameStamp *Stamp; typedef std::pair StampedItem; void reserve(unsigned int len) { _vec.reserve(len); } void resize(unsigned int len, Item item = Item()) { _vec.resize(len, StampedItem(item, ~0)); } unsigned int size() const { return _vec.size(); } void push_back(const Item &item) { _vec.push_back(StampedItem(item, ~0)); } // operator [] provides an Item if indexed directly const Item &operator [] (unsigned int index) const { return _vec[index].first; } // operator [] provides an optional Item if indexed by stamp std::optional operator [] (Stamp stamp) const { int index = findStamp(stamp); if (index < 0) return std::nullopt; return _vec[index].first; } int findStamp(Stamp stamp) const { unsigned int frameNumber = stamp->getFrameNumber(); for (unsigned int i = 0; i < _vec.size(); ++i) if (_vec[i].second == frameNumber) return i; return -1; } void setStamp(unsigned int index, Stamp stamp) { _vec[index].second = stamp->getFrameNumber(); } protected: std::vector _vec; }; } #endif