X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=ref_counted_frame.h;h=cb055f9e3a62ea49bf8d8a963d2aa8b07ea87ef5;hp=881d0d5015c8f5f0738982ba9096eb797edc6b99;hb=refs%2Fheads%2Fcef;hpb=08a992d58c34da8d8bbd70226f7e85c9f30d9514 diff --git a/ref_counted_frame.h b/ref_counted_frame.h index 881d0d5..cb055f9 100644 --- a/ref_counted_frame.h +++ b/ref_counted_frame.h @@ -23,4 +23,31 @@ public: : RefCountedFrameBase(new bmusb::FrameAllocator::Frame(frame), release_refcounted_frame) {} }; +// Similar to RefCountedFrame, but as unique_ptr instead of shared_ptr. + +struct Unique_frame_deleter { + void operator() (bmusb::FrameAllocator::Frame *frame) const { + release_refcounted_frame(frame); + } +}; + +typedef std::unique_ptr + UniqueFrameBase; + +class UniqueFrame : public UniqueFrameBase { +public: + UniqueFrame() {} + + UniqueFrame(const bmusb::FrameAllocator::Frame &frame) + : UniqueFrameBase(new bmusb::FrameAllocator::Frame(frame)) {} + + bmusb::FrameAllocator::Frame get_and_release() + { + bmusb::FrameAllocator::Frame *ptr = release(); + bmusb::FrameAllocator::Frame frame = *ptr; + delete ptr; + return frame; + } +}; + #endif // !defined(_REF_COUNTED_FRAME_H)