X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=ref_counted_frame.h;h=cb055f9e3a62ea49bf8d8a963d2aa8b07ea87ef5;hp=5912ce8187c7fc90ab02d2e5d4c5d3c0e4b0e2be;hb=refs%2Fheads%2Fcef;hpb=6796837c2e3e08de8d530be233317a2fc4a43f72 diff --git a/ref_counted_frame.h b/ref_counted_frame.h index 5912ce8..cb055f9 100644 --- a/ref_counted_frame.h +++ b/ref_counted_frame.h @@ -7,18 +7,47 @@ // Note that the important point isn't really the pointer to the Frame itself, // it's the resources it's representing that need to go back to the allocator. -#include "bmusb.h" +#include -void release_refcounted_frame(FrameAllocator::Frame *frame); +#include "bmusb/bmusb.h" -typedef std::shared_ptr RefCountedFrameBase; +void release_refcounted_frame(bmusb::FrameAllocator::Frame *frame); + +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)