X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Finclude%2Flibsigrok%2Flibsigrok.hpp;h=29d6c73638fa7780253e7287ec1c97faac2eec6d;hb=d9eed47d5bbf9c1a706fbda7ae56f87f7202f995;hp=35b3d441fd6fd9df91f5487a458ce3b04dc43b78;hpb=3bc172a61f1518a2a9cd4c795e6467c80d8f703d;p=libsigrok.git diff --git a/bindings/cxx/include/libsigrok/libsigrok.hpp b/bindings/cxx/include/libsigrok/libsigrok.hpp index 35b3d441..29d6c736 100644 --- a/bindings/cxx/include/libsigrok/libsigrok.hpp +++ b/bindings/cxx/include/libsigrok/libsigrok.hpp @@ -124,9 +124,9 @@ public: const char *what() const throw(); }; -/* Base template for most classes which wrap a struct type from libsigrok. */ -template class SR_API StructureWrapper : - public enable_shared_from_this > +/* Base template for classes whose resources are owned by a parent object. */ +template +class SR_API ParentOwned { protected: /* Parent object which owns this child object's underlying structure. @@ -144,27 +144,40 @@ protected: references to both the parent and all its children are gone. */ shared_ptr parent; + /* Weak pointer for shared_from_this() implementation. */ + weak_ptr weak_this; + public: - shared_ptr > - get_shared_pointer(Parent *parent) + /* Note, this implementation will create a new smart_ptr if none exists. */ + shared_ptr shared_from_this() + { + shared_ptr shared; + + if (!(shared = weak_this.lock())) + { + shared = shared_ptr((Class *) this, reset_parent); + weak_this = shared; + } + + return shared; + } + + shared_ptr get_shared_pointer(shared_ptr parent) { if (!parent) throw Error(SR_ERR_BUG); - this->parent = static_pointer_cast(parent->shared_from_this()); - return shared_ptr >( - this, reset_parent); + this->parent = parent; + return shared_from_this(); } - shared_ptr > - get_shared_pointer(shared_ptr parent) + + shared_ptr get_shared_pointer(Parent *parent) { if (!parent) throw Error(SR_ERR_BUG); - this->parent = parent; - return shared_ptr >( - this, reset_parent); + return get_shared_pointer(parent->shared_from_this()); } protected: - static void reset_parent(StructureWrapper *object) + static void reset_parent(Class *object) { if (!object->parent) throw Error(SR_ERR_BUG); @@ -173,17 +186,45 @@ protected: Struct *structure; - StructureWrapper(Struct *structure) : + ParentOwned(Struct *structure) : + structure(structure) + { + } +}; + +/* Base template for classes whose resources are owned by the user. */ +template +class SR_API UserOwned : public enable_shared_from_this +{ +public: + shared_ptr shared_from_this() + { + auto shared = enable_shared_from_this::shared_from_this(); + if (!shared) + throw Error(SR_ERR_BUG); + return shared; + } +protected: + Struct *structure; + + UserOwned(Struct *structure) : structure(structure) { } + + /* Deleter needed to allow shared_ptr use with protected destructor. */ + class Deleter + { + public: + void operator()(Class *object) { delete object; } + }; }; /** Type of log callback */ typedef function LogCallbackFunction; /** The global libsigrok context */ -class SR_API Context : public enable_shared_from_this +class SR_API Context : public UserOwned { public: /** Create new context */ @@ -228,7 +269,6 @@ public: * @param header Initial data from stream. */ shared_ptr open_stream(string header); protected: - struct sr_context *structure; map drivers; map input_formats; map output_formats; @@ -236,39 +276,11 @@ protected: LogCallbackFunction log_callback; Context(); ~Context(); - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(Context *context) { delete context; } - }; friend class Deleter; friend class Session; friend class Driver; }; -/** A hardware driver provided by the library */ -class SR_API Driver : public StructureWrapper -{ -public: - /** Name of this driver. */ - string get_name(); - /** Long name for this driver. */ - string get_long_name(); - /** Scan for devices and return a list of devices found. - * @param options Mapping of (ConfigKey, value) pairs. */ - vector > scan( - map options = {}); -protected: - bool initialized; - vector devices; - Driver(struct sr_dev_driver *structure); - ~Driver(); - friend class Context; - friend class HardwareDevice; - friend class ChannelGroup; -}; - /** An object that can be configured. */ class SR_API Configurable { @@ -283,6 +295,10 @@ public: /** Enumerate available values for the given configuration key. * @param key ConfigKey to enumerate values for. */ Glib::VariantContainerBase config_list(const ConfigKey *key); + /** Enumerate available keys, according to a given index key. */ + vector config_keys(const ConfigKey *key); + /** Check for a key in the list from a given index key. */ + bool config_check(const ConfigKey *key, const ConfigKey *index_key); protected: Configurable( struct sr_dev_driver *driver, @@ -294,6 +310,30 @@ protected: struct sr_channel_group *config_channel_group; }; +/** A hardware driver provided by the library */ +class SR_API Driver : + public ParentOwned, + public Configurable +{ +public: + /** Name of this driver. */ + string get_name(); + /** Long name for this driver. */ + string get_long_name(); + /** Scan for devices and return a list of devices found. + * @param options Mapping of (ConfigKey, value) pairs. */ + vector > scan( + map options = {}); +protected: + bool initialized; + vector devices; + Driver(struct sr_dev_driver *structure); + ~Driver(); + friend class Context; + friend class HardwareDevice; + friend class ChannelGroup; +}; + /** A generic device, either hardware or virtual */ class SR_API Device : public Configurable { @@ -338,7 +378,7 @@ protected: /** A real hardware device, connected via a driver */ class SR_API HardwareDevice : - public StructureWrapper, + public ParentOwned, public Device { public: @@ -354,7 +394,8 @@ protected: }; /** A channel on a device */ -class SR_API Channel : public StructureWrapper +class SR_API Channel : + public ParentOwned { public: /** Current name of this channel. */ @@ -383,7 +424,7 @@ protected: /** A group of channels on a device, which share some configuration */ class SR_API ChannelGroup : - public StructureWrapper, + public ParentOwned, public Configurable { public: @@ -399,7 +440,7 @@ protected: }; /** A trigger configuration */ -class SR_API Trigger : public enable_shared_from_this +class SR_API Trigger : public UserOwned { public: /** Name of this trigger configuration. */ @@ -411,21 +452,16 @@ public: protected: Trigger(shared_ptr context, string name); ~Trigger(); - struct sr_trigger *structure; shared_ptr context; vector stages; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(Trigger *trigger) { delete trigger; } - }; + friend class Deleter; friend class Context; friend class Session; }; /** A stage in a trigger configuration */ -class SR_API TriggerStage : public StructureWrapper +class SR_API TriggerStage : + public ParentOwned { public: /** Index number of this stage. */ @@ -449,7 +485,8 @@ protected: }; /** A match condition in a trigger configuration */ -class SR_API TriggerMatch : public StructureWrapper +class SR_API TriggerMatch : + public ParentOwned { public: /** Channel this condition matches on. */ @@ -549,7 +586,7 @@ protected: }; /** A sigrok session */ -class SR_API Session +class SR_API Session : public UserOwned { public: /** Add a device to this session. @@ -593,7 +630,6 @@ protected: Session(shared_ptr context); Session(shared_ptr context, string filename); ~Session(); - struct sr_session *structure; const shared_ptr context; map > devices; vector datafeed_callbacks; @@ -603,19 +639,13 @@ protected: string save_filename; uint64_t save_samplerate; shared_ptr trigger; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(Session *session) { delete session; } - }; friend class Deleter; friend class Context; friend class DatafeedCallbackData; }; /** A packet on the session datafeed */ -class SR_API Packet : public enable_shared_from_this +class SR_API Packet : public UserOwned { public: /** Type of this packet. */ @@ -626,15 +656,8 @@ protected: Packet(shared_ptr device, const struct sr_datafeed_packet *structure); ~Packet(); - const struct sr_datafeed_packet *structure; shared_ptr device; PacketPayload *payload; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(Packet *packet) { delete packet; } - }; friend class Deleter; friend class Session; friend class Output; @@ -665,7 +688,7 @@ protected: /** Payload of a datafeed header packet */ class SR_API Header : - public StructureWrapper, + public ParentOwned, public PacketPayload { public: @@ -682,7 +705,7 @@ protected: /** Payload of a datafeed metadata packet */ class SR_API Meta : - public StructureWrapper, + public ParentOwned, public PacketPayload { public: @@ -698,7 +721,7 @@ protected: /** Payload of a datafeed packet with logic data */ class SR_API Logic : - public StructureWrapper, + public ParentOwned, public PacketPayload { public: @@ -717,7 +740,7 @@ protected: /** Payload of a datafeed packet with analog data */ class SR_API Analog : - public StructureWrapper, + public ParentOwned, public PacketPayload { public: @@ -742,7 +765,7 @@ protected: /** An input format supported by the library */ class SR_API InputFormat : - public StructureWrapper + public ParentOwned { public: /** Name of this input format. */ @@ -762,7 +785,7 @@ protected: }; /** An input instance (an input format applied to a file or stream) */ -class SR_API Input : public enable_shared_from_this +class SR_API Input : public UserOwned { public: /** Virtual device associated with this input. */ @@ -773,15 +796,8 @@ public: protected: Input(shared_ptr context, const struct sr_input *structure); ~Input(); - const struct sr_input *structure; shared_ptr context; InputDevice *device; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(Input *input) { delete input; } - }; friend class Deleter; friend class Context; friend class InputFormat; @@ -789,7 +805,7 @@ protected: /** A virtual device associated with an input */ class SR_API InputDevice : - public StructureWrapper, + public ParentOwned, public Device { protected: @@ -797,18 +813,11 @@ protected: ~InputDevice(); shared_ptr get_shared_from_this(); shared_ptr input; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(InputDevice *device) { delete device; } - }; - friend class Deleter; friend class Input; }; /** An option used by an output format */ -class SR_API Option +class SR_API Option : public UserOwned { public: /** Short name of this option suitable for command line usage. */ @@ -825,14 +834,7 @@ protected: Option(const struct sr_option *structure, shared_ptr structure_array); ~Option(); - const struct sr_option *structure; shared_ptr structure_array; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(Option *option) { delete option; } - }; friend class Deleter; friend class InputFormat; friend class OutputFormat; @@ -840,7 +842,7 @@ protected: /** An output format supported by the library */ class SR_API OutputFormat : - public StructureWrapper + public ParentOwned { public: /** Name of this output format. */ @@ -862,7 +864,7 @@ protected: }; /** An output instance (an output format applied to a device) */ -class SR_API Output +class SR_API Output : public UserOwned { public: /** Update output with data from the given packet. @@ -873,16 +875,9 @@ protected: Output(shared_ptr format, shared_ptr device, map options); ~Output(); - const struct sr_output *structure; const shared_ptr format; const shared_ptr device; const map options; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(Output *output) { delete output; } - }; friend class Deleter; friend class OutputFormat; };