Add code to accept command line arguments

Accepts command line arguments for path, interested GPIO transition
and an optional systemd unit file to be called into when the GPIO
transitions per expectation.

Change-Id: I98d967d36cfbb768bc9d0dd04517575fa7e408fe
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/argument.hpp b/argument.hpp
new file mode 100644
index 0000000..a6cccc7
--- /dev/null
+++ b/argument.hpp
@@ -0,0 +1,64 @@
+#pragma once
+
+#include <getopt.h>
+#include <map>
+#include <string>
+
+namespace phosphor
+{
+namespace gpio
+{
+/** @brief Class - Encapsulates parsing command line options and
+ *                 populating arguments
+ */
+class ArgumentParser
+{
+    public:
+        ArgumentParser() = delete;
+        ~ArgumentParser() = default;
+        ArgumentParser(const ArgumentParser&) = delete;
+        ArgumentParser& operator=(const ArgumentParser&) = delete;
+        ArgumentParser(ArgumentParser&&) = default;
+        ArgumentParser& operator=(ArgumentParser&&) = default;
+
+        /** @brief Contructs Argument object
+         *
+         *  @param argc - the main function's argc passed as is
+         *  @param argv - the main function's argv passed as is
+         *  @return Object constructed
+         */
+        ArgumentParser(int argc, char** argv);
+
+        /** @brief Given an option, returns its argument(optarg)
+         *
+         *  @param opt - command line option string
+         *
+         *  @return argument which is a standard optarg
+         */
+        const std::string& operator[](const std::string& opt);
+
+        /** @brief Displays usage
+         *
+         *  @param argv - the main function's argv passed as is
+         */
+        static void usage(char** argv);
+
+        /** @brief Set to 'true' when an option is passed */
+        static const std::string trueString;
+
+        /** @brief Set to '' when an option is not passed */
+        static const std::string emptyString;
+
+    private:
+        /** @brief Option to argument mapping */
+        std::map<const std::string, std::string> arguments;
+
+        /** @brief Array of struct options as needed by getopt_long */
+        static const option options[];
+
+        /** @brief optstring as needed by getopt_long */
+        static const char* optionStr;
+};
+
+} // namespace gpio
+} // namespace phosphor