12251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#ifndef ANDROID_DVR_DELETER_H_
22251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ANDROID_DVR_DELETER_H_
32251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
42251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <sys/cdefs.h>
52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
62251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <memory>
72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Header-only C++ helper to delete opaque DVR objects.
92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__BEGIN_DECLS
112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Use forward declarations to avoid dependency on other headers.
132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrBuffer DvrBuffer;
142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrReadBuffer DvrReadBuffer;
152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrWriteBuffer DvrWriteBuffer;
162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrReadBufferQueue DvrReadBufferQueue;
172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrDisplayManager DvrDisplayManager;
192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrSurfaceState DvrSurfaceState;
202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrSurface DvrSurface;
212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrHwcClient DvrHwcClient;
222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrHwcFrame DvrHwcFrame;
232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrVSyncClient DvrVSyncClient;
242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrBufferDestroy(DvrBuffer* buffer);
262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrReadBufferDestroy(DvrReadBuffer* read_buffer);
272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer);
282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrReadBufferQueueDestroy(DvrReadBufferQueue* read_queue);
292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrWriteBufferQueueDestroy(DvrWriteBufferQueue* write_queue);
302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrDisplayManagerDestroy(DvrDisplayManager* client);
312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrSurfaceStateDestroy(DvrSurfaceState* surface_state);
322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrSurfaceDestroy(DvrSurface* surface);
332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrHwcClientDestroy(DvrHwcClient* client);
342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrHwcFrameDestroy(DvrHwcFrame* frame);
352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrVSyncClientDestroy(DvrVSyncClient* client);
362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__END_DECLS
382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Avoid errors if this header is included in C code.
402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#if defined(__cplusplus)
412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace android {
432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace dvr {
442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Universal DVR object deleter. May be passed to smart pointer types to handle
462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// deletion of DVR API objects.
472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct DvrObjectDeleter {
482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrBuffer* p) { dvrBufferDestroy(p); }
492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrReadBuffer* p) { dvrReadBufferDestroy(p); }
502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrWriteBuffer* p) { dvrWriteBufferDestroy(p); }
512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrReadBufferQueue* p) { dvrReadBufferQueueDestroy(p); }
522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrWriteBufferQueue* p) { dvrWriteBufferQueueDestroy(p); }
532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrDisplayManager* p) { dvrDisplayManagerDestroy(p); }
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrSurfaceState* p) { dvrSurfaceStateDestroy(p); }
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrSurface* p) { dvrSurfaceDestroy(p); }
562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrHwcClient* p) { dvrHwcClientDestroy(p); }
572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrHwcFrame* p) { dvrHwcFrameDestroy(p); }
582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  void operator()(DvrVSyncClient* p) { dvrVSyncClientDestroy(p); }
592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Helper to define unique pointers for DVR object types.
622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T>
632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing MakeUniqueDvrPointer = std::unique_ptr<T, DvrObjectDeleter>;
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Unique pointer types for DVR objects.
662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrBuffer = MakeUniqueDvrPointer<DvrBuffer>;
672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrReadBuffer = MakeUniqueDvrPointer<DvrReadBuffer>;
682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrWriteBuffer = MakeUniqueDvrPointer<DvrWriteBuffer>;
692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrReadBufferQueue = MakeUniqueDvrPointer<DvrReadBufferQueue>;
702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrWriteBufferQueue = MakeUniqueDvrPointer<DvrWriteBufferQueue>;
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrDisplayManager = MakeUniqueDvrPointer<DvrDisplayManager>;
722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrSurfaceState = MakeUniqueDvrPointer<DvrSurfaceState>;
732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrSurface = MakeUniqueDvrPointer<DvrSurface>;
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrHwcClient = MakeUniqueDvrPointer<DvrHwcClient>;
752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrHwcFrame = MakeUniqueDvrPointer<DvrHwcFrame>;
762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrVSyncClient = MakeUniqueDvrPointer<DvrVSyncClient>;
772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// TODO(eieio): Add an adapter for std::shared_ptr that injects the deleter into
792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// the relevant constructors.
802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}  // namespace dvr
822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}  // namespace android
832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#endif // defined(__cplusplus)
852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#endif  // ANDROID_DVR_DELETER_H_
87