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 typedef std::map<std::string, std::string> Dictionary;
46 
48 Dictionary loadDictionary(const char *fn);
49 
51 void refreshDictionary(const char *fn, const Dictionary&);
52 
53 
55 template <class T>
56 std::string toString(T t)
57 {
58  std::ostringstream os;
59  os << t;
60  return os.str();
61 }
62 
64 template <class T>
65 typename std::decay<T>::type // decay "очищает" тип от const, volatile и &
66 try_parse(const std::string &input, T &&default_value = T())
67 {
68  std::istringstream parser(input);
69  typename std::decay<T>::type result = std::forward<T>(default_value);
70  parser >> result;
71  return result;
72 }
73 /*
74  * Функция try_parse может быть записана "проще", как
75  template <class T>
76  T try_parse(const std::string &input, T default_value = T())
77  {
78  std::istringstream parser(input);
79  T result = default_value;
80  parser >> result;
81  return result;
82  }
83  */
84 
86 template <class T>
87 typename std::decay<T>::type
88 try_get(const Dictionary &dict, const std::string &key, T &&default_value = T())
89 {
90  auto p = dict.find(key);
91  return p != dict.end()?
92  try_parse(p->second, std::forward<T>(default_value))
93  : std::forward<T>(default_value);
94 }
95 /*
96  * Функция try_get может быть записана "проще", как
97  template <class T>
98  T try_get(const Dictionary &dict, const std::string &key, T default_value = T())
99  {
100  auto p = dict.find(key);
101  return p != dict.end()? try_parse(p->second, default_value) : default_value;
102  }
103  */