X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Finclude%2Flibsigrok%2Flibsigrok.hpp;h=2a819b09c9649ff0a16636ac2296e936b60c7be8;hb=cac58676e987d06b890366ac4078a1e4fb1cbdc3;hp=f05205a6c997445d9243865a7ca127100c56691a;hpb=43942280bb42a1dd82957aa582fd43d6e2e5dc96;p=libsigrok.git diff --git a/bindings/cxx/include/libsigrok/libsigrok.hpp b/bindings/cxx/include/libsigrok/libsigrok.hpp index f05205a6..2a819b09 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,40 +144,87 @@ 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() { - this->parent = static_pointer_cast(parent->shared_from_this()); - return shared_ptr >( - this, reset_parent); + 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) + + shared_ptr get_shared_pointer(shared_ptr parent) { + if (!parent) + throw Error(SR_ERR_BUG); this->parent = parent; - return shared_ptr >( - this, reset_parent); + return shared_from_this(); + } + + shared_ptr get_shared_pointer(Parent *parent) + { + if (!parent) + throw Error(SR_ERR_BUG); + 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); object->parent.reset(); } 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 */ @@ -222,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; @@ -230,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 { @@ -277,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, @@ -288,11 +310,33 @@ protected: struct sr_channel_group *config_channel_group; }; -/** A generic device, either hardware or virtual */ -class SR_API Device : - public enable_shared_from_this, +/** 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 +{ public: /** Description identifying this device. */ string get_description(); @@ -313,6 +357,7 @@ public: protected: Device(struct sr_dev_inst *structure); ~Device(); + virtual shared_ptr get_shared_from_this() = 0; shared_ptr get_channel(struct sr_channel *ptr); struct sr_dev_inst *structure; map channels; @@ -333,7 +378,7 @@ protected: /** A real hardware device, connected via a driver */ class SR_API HardwareDevice : - public StructureWrapper, + public ParentOwned, public Device { public: @@ -342,13 +387,15 @@ public: protected: HardwareDevice(Driver *driver, struct sr_dev_inst *structure); ~HardwareDevice(); + shared_ptr get_shared_from_this(); Driver *driver; friend class Driver; friend class ChannelGroup; }; /** A channel on a device */ -class SR_API Channel : public StructureWrapper +class SR_API Channel : + public ParentOwned { public: /** Current name of this channel. */ @@ -377,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: @@ -393,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. */ @@ -405,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. */ @@ -443,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. */ @@ -542,8 +585,27 @@ protected: friend class SourceCallbackData; }; +/** A virtual device associated with a stored session */ +class SR_API SessionDevice : + public ParentOwned, + public Device +{ +protected: + SessionDevice(struct sr_dev_inst *sdi); + ~SessionDevice(); + shared_ptr get_shared_from_this(); + /** Deleter needed to allow shared_ptr use with protected destructor. */ + class Deleter + { + public: + void operator()(SessionDevice *device) { delete device; } + }; + friend class Deleter; + friend class Session; +}; + /** A sigrok session */ -class SR_API Session +class SR_API Session : public UserOwned { public: /** Add a device to this session. @@ -587,7 +649,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; @@ -597,19 +658,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. */ @@ -620,15 +675,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; @@ -645,9 +693,7 @@ class SR_API PacketPayload protected: PacketPayload(); virtual ~PacketPayload() = 0; - shared_ptr get_shared_pointer(Packet *parent) { - return static_pointer_cast(get_shared_pointer(parent)); - } + virtual shared_ptr get_shared_pointer(Packet *parent) = 0; /** Deleter needed to allow shared_ptr use with protected destructor. */ class Deleter { @@ -660,8 +706,9 @@ protected: }; /** Payload of a datafeed header packet */ -class SR_API Header : public PacketPayload, - public StructureWrapper +class SR_API Header : + public ParentOwned, + public PacketPayload { public: /* Feed version number. */ @@ -671,13 +718,14 @@ public: protected: Header(const struct sr_datafeed_header *structure); ~Header(); - const struct sr_datafeed_header *structure; + shared_ptr get_shared_pointer(Packet *parent); friend class Packet; }; /** Payload of a datafeed metadata packet */ -class SR_API Meta : public PacketPayload, - public StructureWrapper +class SR_API Meta : + public ParentOwned, + public PacketPayload { public: /* Mapping of (ConfigKey, value) pairs. */ @@ -685,14 +733,15 @@ public: protected: Meta(const struct sr_datafeed_meta *structure); ~Meta(); - const struct sr_datafeed_meta *structure; + shared_ptr get_shared_pointer(Packet *parent); map config; friend class Packet; }; /** Payload of a datafeed packet with logic data */ -class SR_API Logic : public PacketPayload, - public StructureWrapper +class SR_API Logic : + public ParentOwned, + public PacketPayload { public: /* Pointer to data. */ @@ -704,13 +753,14 @@ public: protected: Logic(const struct sr_datafeed_logic *structure); ~Logic(); - const struct sr_datafeed_logic *structure; + shared_ptr get_shared_pointer(Packet *parent); friend class Packet; }; /** Payload of a datafeed packet with analog data */ -class SR_API Analog : public PacketPayload, - public StructureWrapper +class SR_API Analog : + public ParentOwned, + public PacketPayload { public: /** Pointer to data. */ @@ -728,13 +778,13 @@ public: protected: Analog(const struct sr_datafeed_analog *structure); ~Analog(); - const struct sr_datafeed_analog *structure; + shared_ptr get_shared_pointer(Packet *parent); friend class Packet; }; /** An input format supported by the library */ class SR_API InputFormat : - public StructureWrapper + public ParentOwned { public: /** Name of this input format. */ @@ -754,7 +804,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. */ @@ -765,15 +815,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; @@ -781,25 +824,19 @@ protected: /** A virtual device associated with an input */ class SR_API InputDevice : - public StructureWrapper, + public ParentOwned, public Device { protected: InputDevice(shared_ptr input, struct sr_dev_inst *sdi); ~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. */ @@ -816,14 +853,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; @@ -831,7 +861,7 @@ protected: /** An output format supported by the library */ class SR_API OutputFormat : - public StructureWrapper + public ParentOwned { public: /** Name of this output format. */ @@ -853,7 +883,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. @@ -864,16 +894,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; };