libcopp  2.2.0
cmd_option_list.cpp
Go to the documentation of this file.
1 /*
2  * cmd_option_list.cpp
3  *
4  * Created on: 2011-12-29
5  * Author: OWenT
6  *
7  * 应用程序命令处理
8  *
9  */
10 
11 #include "cli/cmd_option_list.h"
12 #include "cli/cmd_option.h"
13 
14 namespace util {
15 namespace cli {
17 
18 cmd_option_list::cmd_option_list() : ext_param_(nullptr) {}
19 
20 cmd_option_list::cmd_option_list(int argv, const char *argc[]) : ext_param_(nullptr) {
21  for (int i = 0; i < argv; ++i) keys_.push_back(std::make_shared<cmd_option_value>(argc[i]));
22 }
23 
24 cmd_option_list::cmd_option_list(const std::vector<std::string> &cmds) : ext_param_(nullptr) {
25  std::vector<std::string>::size_type uSize = cmds.size();
26  for (std::vector<std::string>::size_type i = 0; i < uSize; ++i) {
27  keys_.push_back(std::make_shared<cmd_option_value>(cmds[i].c_str()));
28  }
29 }
30 
32  typedef std::map<std::string, value_type> key_map_type;
33  typedef std::vector<value_type> keys_type;
34  // 已经初始化,跳过
35  if (key_value_.get() != nullptr) return;
36 
37  key_value_ = std::shared_ptr<key_map_type>(new key_map_type());
38 
39  for (keys_type::size_type i = 0; i < keys_.size(); ++i) {
40  const char *str_key = keys_[i]->to_string();
41  if (nullptr == str_key) {
42  continue;
43  }
44 
45  const char *str_val = str_key;
46  for (; *str_val && ':' != *str_val && '=' != *str_val; ++str_val)
47  ;
48  if (*str_val) {
49  ++str_val;
50  } else {
51  continue;
52  }
53 
54  std::string val;
55  cmd_option::get_segment(str_val, val);
56  (*key_value_)[std::string(str_key, str_val - 1)] = std::make_shared<cmd_option_value>(val);
57  }
58 }
59 
60 void cmd_option_list::add(const char *param) { keys_.push_back(std::make_shared<cmd_option_value>(param)); }
61 
63  key_value_.reset(); // 删除key-value映射
64  keys_.clear(); // 删除索引下标映射
65  cmd_array_.clear(); // 删除指令栈集合
66  ext_param_ = nullptr; // 透传参数置空
67 }
68 
70 
71 void cmd_option_list::append_cmd(const char *cmd_content, std::shared_ptr<binder::cmd_option_bind_base> base_node) {
72  cmd_array_.push_back(std::make_pair(cmd_content, base_node));
73 }
74 
75 void cmd_option_list::pop_cmd() { cmd_array_.pop_back(); }
76 
78 
79 cmd_option_list::value_type cmd_option_list::get(std::string key, const char *default_val) {
80  value_type ret_ptr = get(key);
81  if (ret_ptr.get() == nullptr) return std::make_shared<cmd_option_value>(default_val);
82  return ret_ptr;
83 }
84 
87 
88  std::map<std::string, value_type>::const_iterator itr;
89  itr = key_value_->find(key);
90  if (itr == key_value_->end()) return value_type();
91  return itr->second;
92 }
93 
95 
96 // 操作符重载,功能和上面一样
98 
99 // 获取参数数量
101 
102 // 重置Key-Value映射表
104 
105 void cmd_option_list::set_ext_param(void *param) { ext_param_ = param; }
106 
108 } // namespace cli
109 } // namespace util
static const char * get_segment(const char *begin_str, std::string &val)
Definition: cmd_option.h:225
value_type get(std::string key, const char *default_val)
value_type operator[](size_type index) const
std::shared_ptr< cmd_option_value > value_type
void append_cmd(const char *cmd_content, std::shared_ptr< binder::cmd_option_bind_base > base_node)
size_type get_params_number() const
void load_cmd_array(const cmd_array_type &cmds)
std::shared_ptr< std::map< std::string, std::shared_ptr< cmd_option_value > > > key_value_
const cmd_array_type & get_cmd_array() const
std::vector< std::shared_ptr< cmd_option_value > > keys_
std::vector< value_type >::size_type size_type
std::vector< std::pair< std::string, std::shared_ptr< binder::cmd_option_bind_base > > > cmd_array_type
void set_ext_param(void *param)
void add(const char *param)