From: Daniel Elstner Date: Sun, 11 Oct 2015 15:57:30 +0000 (+0200) Subject: C++: Move C struct pointers out of ownership classes X-Git-Tag: libsigrok-0.4.0~169 X-Git-Url: https://sigrok.org/gitweb/?a=commitdiff_plain;h=d5d7b09eb76de71a42b780b97aee5f5019d2d799;p=libsigrok.git C++: Move C struct pointers out of ownership classes Reduce needless over-generalization. There is no design need for the ParentOwned and UserOwned classes to contain the C base struct pointer. Instead, just make the _structure pointer a private member of each class that needs one. --- diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 8efd103a..7f5b3b24 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -120,7 +120,7 @@ shared_ptr Context::create() } Context::Context() : - UserOwned(_structure), + _structure(nullptr), _session(nullptr) { check(sr_init(&_structure)); @@ -384,8 +384,8 @@ map Context::serials(shared_ptr driver) const } Driver::Driver(struct sr_dev_driver *structure) : - ParentOwned(structure), Configurable(structure, nullptr, nullptr), + _structure(structure), _initialized(false) { } @@ -638,7 +638,6 @@ void Device::close() HardwareDevice::HardwareDevice(shared_ptr driver, struct sr_dev_inst *structure) : - UserOwned(structure), Device(structure), _driver(move(driver)) { @@ -659,9 +658,8 @@ shared_ptr HardwareDevice::driver() } UserDevice::UserDevice(string vendor, string model, string version) : - UserOwned(sr_dev_inst_user_new( - vendor.c_str(), model.c_str(), version.c_str())), - Device(UserOwned::_structure) + Device(sr_dev_inst_user_new( + vendor.c_str(), model.c_str(), version.c_str())) { } @@ -686,7 +684,7 @@ shared_ptr UserDevice::add_channel(unsigned int index, } Channel::Channel(struct sr_channel *structure) : - ParentOwned(structure), + _structure(structure), _type(ChannelType::get(_structure->type)) { } @@ -727,10 +725,9 @@ unsigned int Channel::index() const ChannelGroup::ChannelGroup(Device *device, struct sr_channel_group *structure) : - ParentOwned(structure), Configurable(sr_dev_inst_driver_get(device->_structure), device->_structure, structure) { - for (GSList *entry = structure->channels; entry; entry = entry->next) { + for (GSList *entry = config_channel_group->channels; entry; entry = entry->next) { auto *const ch = static_cast(entry->data); _channels.push_back(device->_channels[ch]); } @@ -742,7 +739,7 @@ ChannelGroup::~ChannelGroup() string ChannelGroup::name() const { - return valid_string(_structure->name); + return valid_string(config_channel_group->name); } vector> ChannelGroup::channels() @@ -754,7 +751,7 @@ vector> ChannelGroup::channels() } Trigger::Trigger(shared_ptr context, string name) : - UserOwned(sr_trigger_new(name.c_str())), + _structure(sr_trigger_new(name.c_str())), _context(move(context)) { for (auto stage = _structure->stages; stage; stage = stage->next) @@ -790,8 +787,8 @@ shared_ptr Trigger::add_stage() return stage->share_owned_by(shared_from_this()); } -TriggerStage::TriggerStage(struct sr_trigger_stage *structure) : - ParentOwned(structure) +TriggerStage::TriggerStage(struct sr_trigger_stage *structure) : + _structure(structure) { } @@ -833,7 +830,7 @@ void TriggerStage::add_match(shared_ptr channel, TriggerMatch::TriggerMatch(struct sr_trigger_match *structure, shared_ptr channel) : - ParentOwned(structure), + _structure(structure), _channel(move(channel)) { } @@ -873,7 +870,6 @@ void DatafeedCallbackData::run(const struct sr_dev_inst *sdi, } SessionDevice::SessionDevice(struct sr_dev_inst *structure) : - ParentOwned(structure), Device(structure) { } @@ -888,7 +884,7 @@ shared_ptr SessionDevice::get_shared_from_this() } Session::Session(shared_ptr context) : - UserOwned(_structure), + _structure(nullptr), _context(move(context)) { check(sr_session_new(_context->_structure, &_structure)); @@ -896,7 +892,7 @@ Session::Session(shared_ptr context) : } Session::Session(shared_ptr context, string filename) : - UserOwned(_structure), + _structure(nullptr), _context(move(context)), _filename(move(filename)) { @@ -1047,7 +1043,7 @@ shared_ptr Session::context() Packet::Packet(shared_ptr device, const struct sr_datafeed_packet *structure) : - UserOwned(structure), + _structure(structure), _device(move(device)) { switch (structure->type) @@ -1106,8 +1102,8 @@ PacketPayload::~PacketPayload() } Header::Header(const struct sr_datafeed_header *structure) : - ParentOwned(structure), - PacketPayload() + PacketPayload(), + _structure(structure) { } @@ -1134,8 +1130,8 @@ Glib::TimeVal Header::start_time() const } Meta::Meta(const struct sr_datafeed_meta *structure) : - ParentOwned(structure), - PacketPayload() + PacketPayload(), + _structure(structure) { } @@ -1160,8 +1156,8 @@ map Meta::config() const } Logic::Logic(const struct sr_datafeed_logic *structure) : - ParentOwned(structure), - PacketPayload() + PacketPayload(), + _structure(structure) { } @@ -1191,8 +1187,8 @@ unsigned int Logic::unit_size() const } Analog::Analog(const struct sr_datafeed_analog *structure) : - ParentOwned(structure), - PacketPayload() + PacketPayload(), + _structure(structure) { } @@ -1242,7 +1238,7 @@ vector Analog::mq_flags() const } InputFormat::InputFormat(const struct sr_input_module *structure) : - ParentOwned(structure) + _structure(structure) { } @@ -1294,7 +1290,7 @@ shared_ptr InputFormat::create_input( } Input::Input(shared_ptr context, const struct sr_input *structure) : - UserOwned(structure), + _structure(structure), _context(move(context)), _device(nullptr) { @@ -1335,7 +1331,6 @@ Input::~Input() InputDevice::InputDevice(shared_ptr input, struct sr_dev_inst *structure) : - ParentOwned(structure), Device(structure), _input(move(input)) { @@ -1352,7 +1347,7 @@ shared_ptr InputDevice::get_shared_from_this() Option::Option(const struct sr_option *structure, shared_ptr structure_array) : - UserOwned(structure), + _structure(structure), _structure_array(move(structure_array)) { } @@ -1392,7 +1387,7 @@ vector Option::values() const } OutputFormat::OutputFormat(const struct sr_output_module *structure) : - ParentOwned(structure) + _structure(structure) { } @@ -1457,7 +1452,7 @@ bool OutputFormat::test_flag(const OutputFlag *flag) const Output::Output(shared_ptr format, shared_ptr device, const map &options) : - UserOwned(sr_output_new(format->_structure, + _structure(sr_output_new(format->_structure, map_to_hash_variant(options), device->_structure, nullptr)), _format(move(format)), _device(move(device)), @@ -1467,7 +1462,7 @@ Output::Output(shared_ptr format, Output::Output(string filename, shared_ptr format, shared_ptr device, const map &options) : - UserOwned(sr_output_new(format->_structure, + _structure(sr_output_new(format->_structure, map_to_hash_variant(options), device->_structure, filename.c_str())), _format(move(format)), _device(move(device)), diff --git a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp index f8e0bf4b..c7995b8c 100644 --- a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp +++ b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp @@ -127,7 +127,7 @@ public: }; /* Base template for classes whose resources are owned by a parent object. */ -template +template class SR_API ParentOwned { private: @@ -157,12 +157,7 @@ protected: references to both the parent and all its children are gone. */ shared_ptr _parent; - Struct *_structure; - - explicit ParentOwned(Struct *structure) : - _structure(structure) - { - } + ParentOwned() {} /* Note, this implementation will create a new smart_ptr if none exists. */ shared_ptr shared_from_this() @@ -195,16 +190,11 @@ public: }; /* Base template for classes whose resources are owned by the user. */ -template +template class SR_API UserOwned : public enable_shared_from_this { protected: - Struct *_structure; - - explicit UserOwned(Struct *structure) : - _structure(structure) - { - } + UserOwned() {} shared_ptr shared_from_this() { @@ -249,7 +239,7 @@ private: }; /** The global libsigrok context */ -class SR_API Context : public UserOwned +class SR_API Context : public UserOwned { public: /** Create new context */ @@ -309,6 +299,7 @@ public: shared_ptr open_stream(string header); map serials(shared_ptr driver) const; private: + struct sr_context *_structure; map _drivers; map _input_formats; map _output_formats; @@ -358,7 +349,7 @@ protected: /** A hardware driver provided by the library */ class SR_API Driver : - public ParentOwned, + public ParentOwned, public Configurable { public: @@ -371,6 +362,7 @@ public: vector > scan( const map &options = {}); private: + struct sr_dev_driver *_structure; bool _initialized; vector _devices; explicit Driver(struct sr_dev_driver *structure); @@ -428,7 +420,7 @@ private: /** A real hardware device, connected via a driver */ class SR_API HardwareDevice : - public UserOwned, + public UserOwned, public Device { public: @@ -452,7 +444,7 @@ private: /** A virtual device, created by the user */ class SR_API UserDevice : - public UserOwned, + public UserOwned, public Device { public: @@ -474,7 +466,7 @@ private: /** A channel on a device */ class SR_API Channel : - public ParentOwned + public ParentOwned { public: /** Current name of this channel. */ @@ -494,6 +486,7 @@ public: private: explicit Channel(struct sr_channel *structure); ~Channel(); + struct sr_channel *_structure; const ChannelType * const _type; friend class Device; friend class UserDevice; @@ -505,7 +498,7 @@ private: /** A group of channels on a device, which share some configuration */ class SR_API ChannelGroup : - public ParentOwned, + public ParentOwned, public Configurable { public: @@ -521,7 +514,7 @@ private: }; /** A trigger configuration */ -class SR_API Trigger : public UserOwned +class SR_API Trigger : public UserOwned { public: /** Name of this trigger configuration. */ @@ -533,6 +526,7 @@ public: private: Trigger(shared_ptr context, string name); ~Trigger(); + struct sr_trigger *_structure; shared_ptr _context; vector _stages; friend class Deleter; @@ -542,7 +536,7 @@ private: /** A stage in a trigger configuration */ class SR_API TriggerStage : - public ParentOwned + public ParentOwned { public: /** Index number of this stage. */ @@ -559,6 +553,7 @@ public: * @param value Threshold value. */ void add_match(shared_ptr channel, const TriggerMatchType *type, float value); private: + struct sr_trigger_stage *_structure; vector _matches; explicit TriggerStage(struct sr_trigger_stage *structure); ~TriggerStage(); @@ -567,7 +562,7 @@ private: /** A match condition in a trigger configuration */ class SR_API TriggerMatch : - public ParentOwned + public ParentOwned { public: /** Channel this condition matches on. */ @@ -579,6 +574,7 @@ public: private: TriggerMatch(struct sr_trigger_match *structure, shared_ptr channel); ~TriggerMatch(); + struct sr_trigger_match *_structure; shared_ptr _channel; friend class TriggerStage; }; @@ -606,7 +602,7 @@ private: /** A virtual device associated with a stored session */ class SR_API SessionDevice : - public ParentOwned, + public ParentOwned, public Device { private: @@ -624,7 +620,7 @@ private: }; /** A sigrok session */ -class SR_API Session : public UserOwned +class SR_API Session : public UserOwned { public: /** Add a device to this session. @@ -663,6 +659,7 @@ private: Session(shared_ptr context, string filename); ~Session(); shared_ptr get_device(const struct sr_dev_inst *sdi); + struct sr_session *_structure; const shared_ptr _context; map _owned_devices; map > _other_devices; @@ -677,7 +674,7 @@ private: }; /** A packet on the session datafeed */ -class SR_API Packet : public UserOwned +class SR_API Packet : public UserOwned { public: /** Type of this packet. */ @@ -688,6 +685,7 @@ private: Packet(shared_ptr device, const struct sr_datafeed_packet *structure); ~Packet(); + const struct sr_datafeed_packet *_structure; shared_ptr _device; PacketPayload *_payload; friend class Deleter; @@ -723,7 +721,7 @@ private: /** Payload of a datafeed header packet */ class SR_API Header : - public ParentOwned, + public ParentOwned, public PacketPayload { public: @@ -735,12 +733,15 @@ private: explicit Header(const struct sr_datafeed_header *structure); ~Header(); shared_ptr share_owned_by(shared_ptr parent); + + const struct sr_datafeed_header *_structure; + friend class Packet; }; /** Payload of a datafeed metadata packet */ class SR_API Meta : - public ParentOwned, + public ParentOwned, public PacketPayload { public: @@ -750,13 +751,16 @@ private: explicit Meta(const struct sr_datafeed_meta *structure); ~Meta(); shared_ptr share_owned_by(shared_ptr parent); + + const struct sr_datafeed_meta *_structure; map _config; + friend class Packet; }; /** Payload of a datafeed packet with logic data */ class SR_API Logic : - public ParentOwned, + public ParentOwned, public PacketPayload { public: @@ -770,12 +774,15 @@ private: explicit Logic(const struct sr_datafeed_logic *structure); ~Logic(); shared_ptr share_owned_by(shared_ptr parent); + + const struct sr_datafeed_logic *_structure; + friend class Packet; }; /** Payload of a datafeed packet with analog data */ class SR_API Analog : - public ParentOwned, + public ParentOwned, public PacketPayload { public: @@ -795,12 +802,15 @@ private: explicit Analog(const struct sr_datafeed_analog *structure); ~Analog(); shared_ptr share_owned_by(shared_ptr parent); + + const struct sr_datafeed_analog *_structure; + friend class Packet; }; /** An input format supported by the library */ class SR_API InputFormat : - public ParentOwned + public ParentOwned { public: /** Name of this input format. */ @@ -818,12 +828,15 @@ public: private: explicit InputFormat(const struct sr_input_module *structure); ~InputFormat(); + + const struct sr_input_module *_structure; + friend class Context; friend class InputDevice; }; /** An input instance (an input format applied to a file or stream) */ -class SR_API Input : public UserOwned +class SR_API Input : public UserOwned { public: /** Virtual device associated with this input. */ @@ -837,6 +850,7 @@ public: private: Input(shared_ptr context, const struct sr_input *structure); ~Input(); + const struct sr_input *_structure; shared_ptr _context; InputDevice *_device; friend class Deleter; @@ -846,7 +860,7 @@ private: /** A virtual device associated with an input */ class SR_API InputDevice : - public ParentOwned, + public ParentOwned, public Device { private: @@ -858,7 +872,7 @@ private: }; /** An option used by an output format */ -class SR_API Option : public UserOwned +class SR_API Option : public UserOwned