X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=ref_counted_frame.h;h=cb055f9e3a62ea49bf8d8a963d2aa8b07ea87ef5;hp=67787ef3cbb7289b2929cfe33f83fa7ac7f71765;hb=refs%2Fheads%2Fcef;hpb=d7bba4abb3d56893399578f0540b9ded0a28380f diff --git a/ref_counted_frame.h b/ref_counted_frame.h index 67787ef..cb055f9 100644 --- a/ref_counted_frame.h +++ b/ref_counted_frame.h @@ -11,16 +11,43 @@ #include "bmusb/bmusb.h" -void release_refcounted_frame(FrameAllocator::Frame *frame); +void release_refcounted_frame(bmusb::FrameAllocator::Frame *frame); -typedef std::shared_ptr RefCountedFrameBase; +typedef std::shared_ptr RefCountedFrameBase; class RefCountedFrame : public RefCountedFrameBase { public: RefCountedFrame() {} - RefCountedFrame(const FrameAllocator::Frame &frame) - : RefCountedFrameBase(new FrameAllocator::Frame(frame), release_refcounted_frame) {} + RefCountedFrame(const bmusb::FrameAllocator::Frame &frame) + : 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)