]> sigrok.org Git - libsigrok.git/commitdiff
C++ binding: Allow to re-use ConfigKey::parse_string() for Option class
authorGerhard Sittig <redacted>
Sun, 11 Jun 2017 07:54:52 +0000 (09:54 +0200)
committerGerhard Sittig <redacted>
Sun, 25 Jun 2017 18:42:21 +0000 (20:42 +0200)
Split the data type detection from the actual data type conversion in
the ConfigKey::parse_string() method. Allow the Option class to re-use
the public ConfigKey method, to share the maximum amount of data type
conversion code for both Driver and InputFormat option specs.

This is the least intrusive yet most reliable and consistent approach in
the libsigrok C++ binding that allows applications to support driver scan
and input file format options from command line arguments.

bindings/cxx/ConfigKey_methods.cpp
bindings/cxx/ConfigKey_methods.hpp
bindings/cxx/classes.cpp
bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp

index 54af62e804e76f2d8b3c7c0d628b9e17cc3a747c..be70b06df0e8380cab8aa5209fb554553afcd11e 100644 (file)
@@ -70,12 +70,12 @@ static inline double stod( const std::string& str )
 }
 #endif
 
-Glib::VariantBase ConfigKey::parse_string(string value) const
+Glib::VariantBase ConfigKey::parse_string(string value, enum sr_datatype dt)
 {
        GVariant *variant;
        uint64_t p, q;
 
-       switch (data_type()->id())
+       switch (dt)
        {
                case SR_T_UINT64:
                        check(sr_parse_sizestring(value.c_str(), &p));
@@ -116,3 +116,8 @@ Glib::VariantBase ConfigKey::parse_string(string value) const
        return Glib::VariantBase(variant, false);
 }
 
+Glib::VariantBase ConfigKey::parse_string(string value) const
+{
+       enum sr_datatype dt = (enum sr_datatype)(data_type()->id());
+       return parse_string(value, dt);
+}
index f759cc4e3d6be717279a5873cc0d85345452f34b..bbc7ce8132ef5967f576e1f1e4126f91fe5d9401 100644 (file)
@@ -7,4 +7,5 @@
     /** Get configuration key by string identifier. */
     static const ConfigKey *get_by_identifier(string identifier);
     /** Parse a string argument into the appropriate type for this key. */
+    static Glib::VariantBase parse_string(string value, enum sr_datatype dt);
     Glib::VariantBase parse_string(string value) const;
index e4340fdf8f164d9db5d80bc98f9c4beb683912ed..d292be304bac01401827ae6e9f967cc5afa175e5 100644 (file)
@@ -1483,6 +1483,28 @@ vector<Glib::VariantBase> Option::values() const
        return result;
 }
 
+Glib::VariantBase Option::parse_string(string value)
+{
+       enum sr_datatype dt;
+       Glib::VariantBase dflt = default_value();
+       GVariant *tmpl = dflt.gobj();
+
+       if (g_variant_is_of_type(tmpl, G_VARIANT_TYPE_UINT64)) {
+               dt = SR_T_UINT64;
+       } else if (g_variant_is_of_type(tmpl, G_VARIANT_TYPE_STRING)) {
+               dt = SR_T_STRING;
+       } else if (g_variant_is_of_type(tmpl, G_VARIANT_TYPE_BOOLEAN)) {
+               dt = SR_T_BOOL;
+       } else if (g_variant_is_of_type(tmpl, G_VARIANT_TYPE_DOUBLE)) {
+               dt = SR_T_FLOAT;
+       } else if (g_variant_is_of_type(tmpl, G_VARIANT_TYPE_INT32)) {
+               dt = SR_T_INT32;
+       } else {
+               throw Error(SR_ERR_BUG);
+       }
+       return ConfigKey::parse_string(value, dt);
+}
+
 OutputFormat::OutputFormat(const struct sr_output_module *structure) :
        _structure(structure)
 {
index b1ab7a5bd6f6e04a06607c80017e8fc0d9473f73..00a19b33fe5e7d38b11eae305006a148438d7f4e 100644 (file)
@@ -917,6 +917,8 @@ public:
        Glib::VariantBase default_value() const;
        /** Possible values for this option, if a limited set. */
        vector<Glib::VariantBase> values() const;
+       /** Parse a string argument into the appropriate type for this option. */
+       Glib::VariantBase parse_string(string value);
 private:
        Option(const struct sr_option *structure,
                shared_ptr<const struct sr_option *> structure_array);