]> git.stg.codes - stg.git/blobdiff - projects/sgconf/options.h
Fix build on Darwin.
[stg.git] / projects / sgconf / options.h
index 3d4bdd64263355211dcaf41ef5539506c777f40d..f2f0a0ebaf638ca2c7212b685b1534a5c813606b 100644 (file)
  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
  */
 
-#ifndef __STG_SGCONF_OPTIONS_H__
-#define __STG_SGCONF_OPTIONS_H__
+#pragma once
 
 #include <string>
 #include <vector>
-#include <list>
+#include <utility>
 #include <stdexcept>
+#include <memory>
 #include <cstddef> // size_t
 
 namespace SGCONF
@@ -36,33 +36,33 @@ struct PARSER_STATE;
 class OPTION
 {
     public:
-        OPTION(const std::string & shortName,
-               const std::string & longName,
-               ACTION * action,
-               const std::string & description);
-        OPTION(const std::string & longName,
-               ACTION * action,
-               const std::string & description);
-        OPTION(const OPTION & rhs);
-        ~OPTION();
-
-        OPTION & operator=(const OPTION & rhs);
+        OPTION(const std::string& shortName,
+               const std::string& longName,
+               std::unique_ptr<ACTION> action,
+               const std::string& description);
+        OPTION(const std::string& longName,
+               std::unique_ptr<ACTION> action,
+               const std::string& description);
+
+        OPTION(OPTION&& rhs) = default;
+        OPTION& operator=(OPTION&& rhs) = default;
 
         void Help(size_t level = 0) const;
-        PARSER_STATE Parse(int argc, char ** argv);
-        bool Check(const char * arg) const;
+        PARSER_STATE Parse(int argc, char** argv, void* data);
+        void ParseValue(const std::string & value);
+        bool Check(const char* arg) const;
+        const std::string& Name() const { return m_longName; }
 
-        class ERROR : public std::runtime_error
+        struct ERROR : std::runtime_error
         {
-            public:
-                ERROR(const std::string & message)
-                    : std::runtime_error(message.c_str()) {}
+            explicit ERROR(const std::string & message) noexcept
+                : std::runtime_error(message.c_str()) {}
         };
 
     private:
         std::string m_shortName;
         std::string m_longName;
-        ACTION * m_action;
+        std::unique_ptr<ACTION> m_action;
         std::string m_description;
 };
 
@@ -70,37 +70,49 @@ class OPTION_BLOCK
 {
     public:
         OPTION_BLOCK() {}
-        OPTION_BLOCK(const std::string & description)
+        explicit OPTION_BLOCK(const std::string& description)
             : m_description(description) {}
-        OPTION_BLOCK & Add(const std::string & shortName,
-                           const std::string & longName,
-                           ACTION * action,
-                           const std::string & description);
-        OPTION_BLOCK & Add(const std::string & longName,
-                           ACTION * action,
-                           const std::string & description);
+
+        OPTION_BLOCK(OPTION_BLOCK&&) = default;
+        OPTION_BLOCK& operator=(OPTION_BLOCK&&) = default;
+
+        OPTION_BLOCK& Add(const std::string& shortName,
+                          const std::string& longName,
+                          std::unique_ptr<ACTION> action,
+                          const std::string& description);
+        OPTION_BLOCK& Add(const std::string& longName,
+                          std::unique_ptr<ACTION> action,
+                          const std::string& description);
 
         void Help(size_t level) const;
 
-        PARSER_STATE Parse(int argc, char ** argv);
+        PARSER_STATE Parse(int argc, char** argv, void* data = NULL);
+        void ParseFile(const std::string& filePath);
+
+        struct ERROR : std::runtime_error
+        {
+            explicit ERROR(const std::string & message) noexcept
+                : std::runtime_error(message.c_str()) {}
+        };
 
     private:
         std::vector<OPTION> m_options;
         std::string m_description;
+
+        void OptionCallback(const std::string& key, const std::string& value);
 };
 
 class OPTION_BLOCKS
 {
     public:
-        OPTION_BLOCK & Add(const std::string & description)
+        OPTION_BLOCK& Add(const std::string& description)
         { m_blocks.push_back(OPTION_BLOCK(description)); return m_blocks.back(); }
+        void Add(OPTION_BLOCK&& block) { m_blocks.push_back(std::move(block)); }
         void Help(size_t level) const;
-        PARSER_STATE Parse(int argc, char ** argv);
+        PARSER_STATE Parse(int argc, char** argv);
 
     private:
-        std::list<OPTION_BLOCK> m_blocks;
+        std::vector<OPTION_BLOCK> m_blocks;
 };
 
 } // namespace SGCONF
-
-#endif