Imported Upstream version 1.9.0
[platform/core/ml/nnfw.git] / compiler / souschef / include / souschef / Dataset.h
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *    http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __SOUSCHEF_DATASET_H__
18 #define __SOUSCHEF_DATASET_H__
19
20 #include <vector>
21
22 #include <google/protobuf/repeated_field.h>
23
24 namespace souschef
25 {
26
27 template <typename T> class Dataset
28 {
29 public:
30   Dataset(const std::vector<T> &vec) : _vec{vec}
31   {
32     // DO NOTHING
33   }
34
35 public:
36   Dataset(std::vector<T> &&vec) : _vec{std::move(vec)}
37   {
38     // DO NOTHING
39   }
40
41 public:
42   template <typename Func> auto map(Func f) const -> Dataset<decltype(f(std::declval<T>()))>
43   {
44     using U = decltype(f(std::declval<T>()));
45     std::vector<U> res;
46
47     for (const auto &elem : _vec)
48     {
49       res.emplace_back(f(elem));
50     }
51
52     return Dataset<U>(std::move(res));
53   }
54
55 public:
56   const std::vector<T> &vectorize(void) const { return _vec; }
57
58 private:
59   std::vector<T> _vec;
60 };
61
62 template <typename T> std::vector<T> as_vector(const ::google::protobuf::RepeatedPtrField<T> &field)
63 {
64   std::vector<T> res;
65   for (const auto &elem : field)
66   {
67     res.emplace_back(elem);
68   }
69   return res;
70 }
71
72 template <typename T> Dataset<T> as_dataset(const ::google::protobuf::RepeatedPtrField<T> &field)
73 {
74   return Dataset<T>(as_vector<T>(field));
75 }
76
77 } // namespace souschef
78
79 #endif // __SOUSCHEF_DATASET_H__