libcopp  1.2.1
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 {
16  const char *binder::cmd_option_bind_base::ROOT_NODE_CMD = "@Root";
17 
18  cmd_option_list::cmd_option_list() : ext_param_(NULL) {}
19 
20  cmd_option_list::cmd_option_list(int argv, const char *argc[]) : ext_param_(NULL) {
21  for (int i = 0; i < argv; ++i)
22  keys_.push_back(std::make_shared<cmd_option_value>(argc[i]));
23  }
24 
25  cmd_option_list::cmd_option_list(const std::vector<std::string> &cmds) : ext_param_(NULL) {
26  std::vector<std::string>::size_type uSize = cmds.size();
27  for (std::vector<std::string>::size_type i = 0; i < uSize; ++i) {
28  keys_.push_back(std::make_shared<cmd_option_value>(cmds[i].c_str()));
29  }
30  }
31 
32 
34  typedef std::map<std::string, value_type> key_map_type;
35  typedef std::vector<value_type> keys_type;
36  // 已经初始化,跳过
37  if (key_value_.get() != NULL) return;
38 
39  key_value_ = std::shared_ptr<key_map_type>(new key_map_type());
40 
41  for (keys_type::size_type i = 0; i < keys_.size(); ++i) {
42  const char *str_key = keys_[i]->to_string();
43  if (NULL == str_key) {
44  continue;
45  }
46 
47  const char *str_val = str_key;
48  for (; *str_val && ':' != *str_val && '=' != *str_val; ++str_val)
49  ;
50  if (*str_val) {
51  ++str_val;
52  } else {
53  continue;
54  }
55 
56  std::string val;
57  cmd_option::get_segment(str_val, val);
58  (*key_value_)[std::string(str_key, str_val - 1)] = std::make_shared<cmd_option_value>(val);
59  }
60  }
61 
62  void cmd_option_list::add(const char *param) { keys_.push_back(std::make_shared<cmd_option_value>(param)); }
63 
65  key_value_.reset(); // 删除key-value映射
66  keys_.clear(); // 删除索引下标映射
67  cmd_array_.clear(); // 删除指令栈集合
68  ext_param_ = NULL; // 透传参数置空
69  }
70 
72 
73  void cmd_option_list::append_cmd(const char *cmd_content, std::shared_ptr<binder::cmd_option_bind_base> base_node) {
74  cmd_array_.push_back(std::make_pair(cmd_content, base_node));
75  }
76 
77  void cmd_option_list::pop_cmd() { cmd_array_.pop_back(); }
78 
80 
81  cmd_option_list::value_type cmd_option_list::get(std::string key, const char *default_val) {
82  value_type ret_ptr = get(key);
83  if (ret_ptr.get() == NULL) return std::make_shared<cmd_option_value>(default_val);
84  return ret_ptr;
85  }
86 
89 
90  std::map<std::string, value_type>::const_iterator itr;
91  itr = key_value_->find(key);
92  if (itr == key_value_->end()) return value_type();
93  return itr->second;
94  }
95 
97 
98  // 操作符重载,功能和上面一样
100 
101  // 获取参数数量
103 
104  // 重置Key-Value映射表
106 
107  void cmd_option_list::set_ext_param(void *param) { ext_param_ = param; }
108 
109  void *cmd_option_list::get_ext_param() const { return ext_param_; }
110  }
111 }
std::vector< std::shared_ptr< cmd_option_value > > keys_
std::shared_ptr< std::map< std::string, std::shared_ptr< cmd_option_value > > > key_value_
const cmd_array_type & get_cmd_array() const
size_type get_params_number() const
std::vector< std::pair< std::string, std::shared_ptr< binder::cmd_option_bind_base > > > cmd_array_type
std::vector< value_type >::size_type size_type
void set_ext_param(void *param)
void load_cmd_array(const cmd_array_type &cmds)
void append_cmd(const char *cmd_content, std::shared_ptr< binder::cmd_option_bind_base > base_node)
void add(const char *param)
std::shared_ptr< cmd_option_value > value_type
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