Zmeika
простая аркадная игра
 Указатель Классы Пространства имен Файлы Функции Переменные Определения типов Перечисления Страницы
ConfigFile.hpp
См. документацию.
1 /*
2  * This file is part of AV Orchid.
3  * Copyright (c) 2013, Dmitri R. Kuvshinov <evetro.here@gmail.com>
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
28 #pragma once
29 #include <map>
30 #include <string>
31 #include <sstream>
32 #include <type_traits>
33 
34 
36 
45 using Dictionary = std::map<std::string, std::string>;
46 
48 
52 Dictionary load_dictionary(const char *fn);
53 
55 
59 void refresh_dictionary(const char *fn, const Dictionary &d);
60 
61 
63 
67 template <class T>
68 std::string toString(T t)
69 {
70  std::ostringstream os;
71  os << t;
72  return os.str();
73 }
74 
76 
81 template <class T>
82 typename std::decay<T>::type // decay "очищает" тип от const, volatile и &
83 try_parse(const std::string &input, T &&default_value = T())
84 {
85  std::istringstream parser(input);
86  typename std::decay<T>::type result = std::forward<T>(default_value);
87  parser >> result;
88  return result;
89 }
90 /*
91  * Функция try_parse может быть записана "проще", как
92  template <class T>
93  T try_parse(const std::string &input, T default_value = T())
94  {
95  std::istringstream parser(input);
96  T result = default_value;
97  parser >> result;
98  return result;
99  }
100  */
101 
103 
109 template <class T>
110 typename std::decay<T>::type
111 try_get(const Dictionary &dict, const std::string &key, T &&default_value = T())
112 {
113  auto p = dict.find(key);
114  if (p != dict.end())
115  return try_parse(p->second, std::forward<T>(default_value));
116  return std::forward<T>(default_value);
117 }
118 /*
119  * Функция try_get может быть записана "проще", как
120  template <class T>
121  T try_get(const Dictionary &dict, const std::string &key, T default_value = T())
122  {
123  auto p = dict.find(key);
124  return p != dict.end()? try_parse(p->second, default_value) : default_value;
125  }
126  */