#include namespace reanimated::css { template DelayedItem::DelayedItem(const double timestamp, const TValue value) : timestamp(timestamp), value(value) {} template bool DelayedItemComparator::operator()( const DelayedItem &lhs, const DelayedItem &rhs) const { if (lhs.timestamp == rhs.timestamp) { // Use address comparison as a tiebreaker when timestamps are equal return std::less{}(&lhs.value, &rhs.value); } return lhs.timestamp < rhs.timestamp; } template void DelayedItemsManager::add( const double timestamp, const TValue value) { auto result = itemsSet_.emplace(timestamp, value); if (result.second) { itemsMap_[result.first->value] = result.first; } } template typename DelayedItemsManager::Item DelayedItemsManager::pop() { if (itemsSet_.empty()) { throw std::runtime_error("[Reanimated] No delayed items available to pop"); } auto it = itemsSet_.begin(); Item result = std::move(*it); itemsMap_.erase(it->value); itemsSet_.erase(it); return result; } template bool DelayedItemsManager::remove(const TValue value) { auto it = itemsMap_.find(value); if (it == itemsMap_.end()) { return false; } itemsSet_.erase(it->second); itemsMap_.erase(it); return true; } template const typename DelayedItemsManager::Item & DelayedItemsManager::top() const { if (itemsSet_.empty()) { throw std::runtime_error("[Reanimated] No delayed items available"); } return *itemsSet_.begin(); } template bool DelayedItemsManager::empty() const { return itemsSet_.empty(); } template size_t DelayedItemsManager::size() const { return itemsSet_.size(); } // Declare the types that will be used in the DelayedItemsManager class template class DelayedItemsManager>; template class DelayedItemsManager; } // namespace reanimated::css