[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-physics / third-party / bullet3 / src / Bullet3Common / b3CommandLineArgs.h
1 #ifndef COMMAND_LINE_ARGS_H
2 #define COMMAND_LINE_ARGS_H
3
4 /******************************************************************************
5  * Command-line parsing
6  ******************************************************************************/
7 #include <map>
8 #include <algorithm>
9 #include <string>
10 #include <cstring>
11 #include <sstream>
12 class b3CommandLineArgs
13 {
14 protected:
15         std::map<std::string, std::string> pairs;
16
17 public:
18         // Constructor
19         b3CommandLineArgs(int argc, char **argv)
20         {
21                 addArgs(argc, argv);
22         }
23
24         void addArgs(int argc, char **argv)
25         {
26                 for (int i = 1; i < argc; i++)
27                 {
28                         std::string arg = argv[i];
29
30                         if ((arg.length() < 2) || (arg[0] != '-') || (arg[1] != '-'))
31                         {
32                                 continue;
33                         }
34
35                         std::string::size_type pos;
36                         std::string key, val;
37                         if ((pos = arg.find('=')) == std::string::npos)
38                         {
39                                 key = std::string(arg, 2, arg.length() - 2);
40                                 val = "";
41                         }
42                         else
43                         {
44                                 key = std::string(arg, 2, pos - 2);
45                                 val = std::string(arg, pos + 1, arg.length() - 1);
46                         }
47
48                         //only add new keys, don't replace existing
49                         if (pairs.find(key) == pairs.end())
50                         {
51                                 pairs[key] = val;
52                         }
53                 }
54         }
55
56         bool CheckCmdLineFlag(const char *arg_name)
57         {
58                 std::map<std::string, std::string>::iterator itr;
59                 if ((itr = pairs.find(arg_name)) != pairs.end())
60                 {
61                         return true;
62                 }
63                 return false;
64         }
65
66         template <typename T>
67         bool GetCmdLineArgument(const char *arg_name, T &val);
68
69         int ParsedArgc()
70         {
71                 return pairs.size();
72         }
73 };
74
75 template <typename T>
76 inline bool b3CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val)
77 {
78         std::map<std::string, std::string>::iterator itr;
79         if ((itr = pairs.find(arg_name)) != pairs.end())
80         {
81                 std::istringstream strstream(itr->second);
82                 strstream >> val;
83                 return true;
84         }
85         return false;
86 }
87
88 template <>
89 inline bool b3CommandLineArgs::GetCmdLineArgument<char *>(const char *arg_name, char *&val)
90 {
91         std::map<std::string, std::string>::iterator itr;
92         if ((itr = pairs.find(arg_name)) != pairs.end())
93         {
94                 std::string s = itr->second;
95                 val = (char *)malloc(sizeof(char) * (s.length() + 1));
96                 std::strcpy(val, s.c_str());
97                 return true;
98         }
99         else
100         {
101                 val = NULL;
102         }
103         return false;
104 }
105
106 #endif  //COMMAND_LINE_ARGS_H