SigUtil  0.95
Utility modules for modern C++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
botsu.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "lib/utility.hpp"
4 
5 namespace sig
6 {
7 
8  /*
9  //[a] -> [b] -> (a -> b -> void) -> void
10  //戻り値の型がvoidの場合
11  template <class R, class A, class B, template < class T, class = std::allocator<T >> class Container, typename std::enable_if<std::is_same<R, void>::value>::type*& = enabler>
12  void zipWith(Container<A> const& list1, Container<B> const& list2, std::function<void(typename std::common_type<A>::type, typename std::common_type<B>::type)> const& func)
13  {
14  const uint length = list1.size() < list2.size() ? list1.size() : list2.size();
15  uint i = 0;
16  for (auto it1 = std::begin(list1), it2 = std::begin(list2), end1 = std::end(list1), end2 = std::end(list2); i < length; ++i, ++it1, ++it2) func(*it1, *it2);
17  }
18  */
19 
20  /* コンテナ */
21 #if SIG_ENABLE_BOOST
22 
23  //動的確保される固定長配列 (構築後のサイズ変更不可)
24  template <class T, class Allocator = std::allocator<T>>
25  class FixedVector
26  {
27  public:
28  typedef T value_type;
29  typedef typename boost::call_traits<T>::param_type param_type;
30  typedef typename boost::call_traits<T>::reference reference;
31  typedef typename boost::call_traits<T>::const_reference const_reference;
32  typedef typename boost::call_traits<T>::value_type result_type;
33 
34  typedef uint size_type;
35 
36  private:
37  std::vector<T> _data;
38 
39  public:
40  explicit FixedVector(Allocator const& alloc = Allocator()) : _data(alloc){}
41  explicit FixedVector(size_type size, param_type value = T(), Allocator const& alloc = Allocator()) : _data(size, value, alloc){}
42  // explicit FixedVector(size_type count, T value) : _data(size, value){}
43  template <class InputIter> FixedVector(InputIter first, InputIter last, Allocator const& alloc = Allocator()) : _data(first, last, alloc){}
44  explicit FixedVector(std::vector<T> const& src) : _data(src){}
45  explicit FixedVector(std::vector<T> && src) : _data(move(src)){}
46 
47  FixedVector(FixedVector const& src) : _data(src._data){}
48  FixedVector(FixedVector && src) : _data(move(src._data)){}
49  FixedVector(std::initializer_list<T> init, Allocator const& alloc = Allocator()) : _data(init){}
50 
51  FixedVector& operator=(FixedVector const& src){
52  *this = FixedVector(src);
53  return *this;
54  }
55  FixedVector& operator=(FixedVector && src){
56  this->_data = move(src._data);
57  return *this;
58  }
59  FixedVector& operator=(std::initializer_list<T> ilist){
60  *this = FixedVector(ilist.begin(), ilist.end());
61  return *this;
62  }
63  FixedVector& operator=(std::vector<T> const& src){
64  this->_data = src;
65  return *this;
66  }
67  FixedVector& operator=(std::vector<T> && src){
68  this->_data = move(src);
69  return *this;
70  }
71 
72  auto begin()->decltype(_data.begin()){ return _data.begin(); }
73  auto begin() const ->decltype(_data.begin()){ return _data.begin(); }
74  auto cbegin() const ->decltype(_data.cbegin()){ return _data.cbegin(); }
75 
76  auto end()->decltype(_data.end()){ return _data.end(); }
77  auto end() const ->decltype(_data.end()){ return _data.end(); }
78  auto cend() const ->decltype(_data.cend()){ return _data.cend(); }
79 
80  auto rbegin()->decltype(_data.rbegin()){ return _data.rbegin(); }
81  auto rbegin() const ->decltype(_data.rbegin()){ return _data.rbegin(); }
82  auto crbegin() const ->decltype(_data.crbegin()){ return _data.crbegin(); }
83 
84  auto rend()->decltype(_data.rend()){ return _data.rend(); }
85  auto rend() const ->decltype(_data.rend()){ return _data.rend(); }
86  auto crend() const ->decltype(_data.crend()){ return _data.crend(); }
87 
88  reference at(size_type pos){ return _data.at(pos); }
89  const_reference at(size_type pos) const{ return _data.at(pos); }
90 
91  reference operator [](size_type pos){ return _data[pos]; }
92  const_reference operator [](size_type pos) const{ return _data[pos]; }
93 
94  reference front(){ return _data.front(); }
95  const_reference front() const{ return _data.front(); }
96 
97  reference back(){ return _data.back(); }
98  const_reference back() const{ return _data.back(); }
99 
100  bool empty() const{ return _data.empty(); }
101 
102  size_type size() const{ return _data.size(); }
103 
104  size_type max_size() const{ return _data.max_size; }
105 
106  void swap(FixedVector& other){ _data.swap(other); }
107  };
108 #endif
109 
110  /*
111  //vector, list の積集合を求める(要素数は1個). [動作要件:T::operator==()]
112  template <class T, template<class T_, class = std::allocator<T_>> class Container>
113  Container<T> SetIntersection(Container<T> const& src1, Container<T> const& src2)
114  {
115  Container<T> result;
116 
117  for (T const& e1 : src1){
118  for (T const& e2 : src2){
119  if (e1 == e2 && [&result, &e2]()->bool{
120  for (T const& r : result){
121  if (r == e2) return false;
122  }
123  return true;
124  }()){
125  result.push_back(e2);
126  }
127  }
128  }
129  return move(result);
130  }
131 
132  //unordered_set の積集合を求める.[動作要件:T::operator==()]
133  template <class T>
134  std::unordered_set<T> SetIntersection(std::unordered_set<T> const& src1, std::unordered_set<T> const& src2)
135  {
136  std::unordered_set<T> result;
137 
138  for (T const& e1 : src1){
139  for (T const& e2 : src2){
140  if (e1 == e2) result.insert(e2);
141  }
142  }
143  return move(result);
144  }
145 
146  //unordered_map の積集合を求める(bool key ? キーで比較【第1引数の要素を取得】 : 両方一致). [動作要件:K::operator==(), V::operator==()]
147  template <class K, class V>
148  std::unordered_map<K, V> SetIntersection(std::unordered_map<K, V> const& src, std::unordered_map<K, V> const& other, bool const key)
149  {
150  std::unordered_map<K, V> result;
151 
152  for (auto const& e : src){
153  for (auto const& o : other){
154  if (key && e.first == o.first) result.insert(e);
155  else if (e == o) result.insert(e);
156  }
157  }
158  return move(result);
159  }
160 
161 
162  //vector, list の差集合を求める(要素数は1個). [動作要件:T::operator==()]
163  template <class T, template<class T_, class = std::allocator<T_>> class Container>
164  Container<T> SetDifference(Container<T> const& src1, Container<T> const& src2)
165  {
166  Container<T> result, sum(src1);
167  sum.insert(sum.end(), src2.begin(), src2.end());
168 
169  auto intersection = SetIntersection(src1, src2);
170 
171  for (T const& s : sum){
172  if ([&intersection, &s]()->bool{
173  for (T const& i : intersection){
174  if (s == i) return false;
175  }
176  return true;
177  }() && [&result, &s]()->bool{
178  for (T const& r : result){
179  if (s == r) return false;
180  }
181  return true;
182  }()){
183  result.push_back(s);
184  }
185  }
186  return move(result);
187  }
188 
189  //unordered_set の差集合を求める.[動作要件:T::operator==()]
190  template <class T>
191  std::unordered_set<T> SetDifference(std::unordered_set<T> const& src1, std::unordered_set<T> const& src2)
192  {
193  std::unordered_set<T> result, sum(src1);
194  sum.insert(src2.begin(), src2.end());
195 
196  auto intersection = SetIntersection(src1, src2);
197 
198  for (T const& s : sum){
199  if ([&intersection, &s]()->bool{
200  for (T const& i : intersection){
201  if (s == i) return false;
202  }
203  return true;
204  }()){
205  result.insert(s);
206  }
207  }
208  return move(result);
209  }
210 
211  //unordered_map の差集合を求める(bool key ? キーで比較 : 両方一致). [動作要件:K::operator==(), V::operator==()]
212  template <class K, class V>
213  std::unordered_map<K, V> SetDifference(std::unordered_map<K, V> const& src1, std::unordered_map<K, V> const& src2, bool const key)
214  {
215  std::unordered_map<K, V> result, sum(src1);
216  sum.insert(src2.begin(), src2.end());
217 
218  auto intersection = SetIntersection(src1, src2, key);
219 
220  for (auto const& s : sum){
221  if ([&intersection, &s, key]()->bool{
222  for (auto const& i : intersection){
223  if (key && s.first == i.first) return false;
224  else if (!key && s == i) return false;
225  }
226  return true;
227  }()){
228  result.insert(s);
229  }
230  }
231  return move(result);
232  }
233  */
234 
235 
236 /*
237 std::cout << container_traits<int>::exist << std::endl;
238 std::cout << container_traits<std::vector<int>>::exist << std::endl;
239 std::cout << container_traits<std::array<int,3>>::exist << std::endl;
240 
241 sig::TimeWatch tw;
242 for (int i=0; i<100; ++i){
243 tw.Stop();
244 std::vector<Tes> vec(100000, 1);
245 tw.ReStart();
246 auto d = sig::plus(2, vec);
247 //for (auto& v : vec){ v += 2; }
248 tw.Save();
249 }
250 
251 std::cout << tw.GetTotalTime() << std::endl;
252 
253 
254 std::vector<int> vec{1,2, 3, 4, 5, 6, 7};
255 std::vector<std::vector<double>> result;
256 
257 const auto Task = [&t](int id){
258 std::vector<double> r(id, 0);
259 
260 std::cout << "id:" << id << std::endl;
261 
262 return std::move(r);
263 };
264 
265 std::vector<std::future< std::vector<double> >> task;
266 
267 tw.Save();
268 for (auto const& v :vec){
269 task.push_back(std::async(std::launch::async, Task, v));
270 }
271 
272 tw.Save();
273 for (auto& t : task){
274 result.push_back(t.get());
275 }
276 tw.Save();
277 
278 std::cout << std::endl;
279 std::cout << sig::fromJust(tw.GetLapTime(0)) << std::endl;
280 std::cout << sig::fromJust(tw.GetLapTime(1)) << std::endl;
281 std::cout << sig::fromJust(tw.GetLapTime(2)) << std::endl;
282 */
283 
284 
285 /*
286 template<uint I = 0, typename Func, typename... Ts>
287 auto ForEach(std::tuple<Ts...> &, Func) ->typename std::enable_if<I == sizeof...(Ts), void>::type{}
288 
289 template<uint I = 0, typename Func, typename... Ts>
290 auto ForEach(std::tuple<Ts...>& t, Func f) ->typename std::enable_if<I < sizeof...(Ts), void>::type
291 {
292 f(std::get<I>(t));
293 ForEach<I + 1, Func, Ts...>(t, f);
294 }
295 
296 template <class T>
297 constexpr auto HasBegin(int) ->decltype(std::declval<T>().begin(), bool()){ return true; }
298 
299 template <class T>
300 constexpr bool HasBegin(...){ return false; }
301 */
302 
303 /*
304 template <class C>
305 auto TestImpl(C c)
306 {
307 container_traits<C>::add_element(c, 1);
308 return std::make_tuple(std::move(c));
309 }
310 template <class C, class... Cs>
311 auto TestImpl(C c, Cs... cs)
312 {
313 container_traits<C>::add_element(c, 1);
314 return std::tuple_cat(std::make_tuple(std::move(c)), TestImpl(cs...));
315 }
316 
317 template <class T, size_t... I>
318 auto Test(T const& tuple, std::index_sequence<I...>)
319 {
320 return TestImpl(std::vector<typename std::tuple_element<I, T>::type>{}...);
321 }
322 */
323 
324 
325 //template <class Container, class Sfinae = void> struct ContainerConstructor{ typedef Container type; };
326 //template <class Container> struct ContainerConstructor<Container, typename std::enable_if<std::is_array<Container>::value>::type>{ typedef std::array<std::remove_extent<Container>, std::rank<Container>::value> type; };
327 
328 //template <class T, class D = void> struct HasBegin : std::true_type{};
329 //template <class T> struct HasBegin<T, decltype(std::declval<T>().begin())> : std::false_type{};
330 
331 //template <typename T> constexpr auto has_reserve_method(int) -> decltype(std::declval<T>().reserve(0), bool()) { return true; }
332 //template <typename T> constexpr bool has_reserve_method(...) { return false; }
333 
334 /*template <typename T>
335 auto Reserve(T& t, size_t n) -> typename std::enable_if<has_reserve_method<T>(0), void>::type {
336 std::cout << "true" << std::endl;
337 t.reserve(n);
338 }
339 
340 template <typename T>
341 auto Reserve(T& t, size_t n) -> typename std::enable_if<!has_reserve_method<T>(0), void>::type {
342 std::cout << "false" << std::endl;
343 }*/
344 
345 /*template <typename T, typename std::enable_if<has_reserve_method<T>(0)>::type *& = enabler>
346 void Reserve(T& t, size_t n){
347 std::cout << "true" << std::endl;
348 t.reserve(n);
349 }
350 
351 template <typename T, typename std::enable_if<!has_reserve_method<T>(0)>::type *& = enabler>
352 void Reserve(T& t, size_t n) {
353 std::cout << "false" << std::endl;
354 }*/
355 /*
356 template <class T>
357 auto Reserve(T& t, size_t n) ->decltype(t.reserve(n), void()){ t.reserve(n); std::cout << "true" << std::endl; }
358 
359 template <class T>
360 void Reserve(T& t, size_t n){ std::cout << "false" << std::endl; }
361 */
362 
363 
364 }
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
auto rbegin(C &&c) -> std::move_iterator< typename RC::reverse_iterator >
auto rend(C &&c) -> std::move_iterator< typename RC::reverse_iterator >
Definition: array.hpp:15
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >