8
8
9
9
namespace impl {
10
10
11
- typedef std::pair<size_t , size_t > Range;
12
-
13
11
template <typename T>
14
12
class GenericArray : public Repr <GenericArray<T>>, public std::vector<T> {
15
13
public:
@@ -36,10 +34,10 @@ class GenericArray : public Repr<GenericArray<T>>, public std::vector<T> {
36
34
using Base::begin;
37
35
using Base::end;
38
36
39
- static GenericArray<T> random ( size_t size, T max);
40
- static GenericArray<T> random (size_t size, T min, T max );
41
- static GenericArray<T> random ( const Range& size, T max);
42
- static GenericArray<T> random ( const Range& size, T min, T max );
37
+ template < typename ...Args>
38
+ static GenericArray<T> random (size_t size, const Args& ... args );
39
+ template < typename ...Args>
40
+ static GenericArray<T> randomUnique ( size_t size, const Args& ... args );
43
41
44
42
static GenericArray<T> id (size_t size, T start = T{});
45
43
@@ -69,57 +67,63 @@ class GenericArray : public Repr<GenericArray<T>>, public std::vector<T> {
69
67
};
70
68
71
69
template <typename T>
72
- GenericArray<T> GenericArray<T>::random(size_t size, T max) {
73
- GenericArray<T> result (size);
74
- for (T& x: result) {
75
- x = rnd.next (max);
76
- }
77
- return result;
78
- }
79
-
80
- template <typename T>
81
- GenericArray<T> GenericArray<T>::random(size_t size, T min, T max) {
70
+ template <typename ...Args>
71
+ GenericArray<T> GenericArray<T>::random(size_t size, const Args& ... args) {
82
72
GenericArray<T> result (size);
83
73
for (T& x: result) {
84
- x = rnd.next (min, max );
74
+ x = rnd.next (args... );
85
75
}
86
76
return result;
87
77
}
88
78
89
- template <typename T>
90
- GenericArray<T> GenericArray<T>::random(const Range& size, T max) {
91
- return random (rnd.next (size.first , size.second ), max);
92
- }
79
+ namespace detail {
93
80
94
- template <typename T>
95
- GenericArray<T> GenericArray<T>::random( const Range& size, T min, T max) {
96
- return random (rnd. next (size. first , size. second ), min, max) ;
97
- }
81
+ template <typename T, typename Enable = std:: size_t >
82
+ struct DictContainer {
83
+ typedef std::set<T> type ;
84
+ };
98
85
99
86
template <typename T>
100
- auto genericArrayIdHelper (size_t size, T start)
101
- -> typename std::enable_if<
102
- std::is_integral<T>::value, GenericArray<T>
103
- >::type
87
+ struct DictContainer <T, typename std::hash<T>::result_type>
104
88
{
105
- GenericArray <T> result (size) ;
106
- std::iota (result. begin (), result. end (), start) ;
107
- return result;
108
- }
89
+ typedef std::unordered_set <T> type ;
90
+ } ;
91
+
92
+ } // namespace detail
109
93
110
94
template <typename T>
111
- auto genericArrayIdHelper (size_t size, const T& start)
112
- -> typename std::enable_if<
113
- !std::is_integral<T>::value, GenericArray<T>
114
- >::type
95
+ template <typename ...Args>
96
+ GenericArray<T> GenericArray<T>::randomUnique(
97
+ size_t size, const Args& ... args)
115
98
{
116
- ensure (" Cannot take GenericArray<T>::id() when T is non-integral" );
117
- return {};
99
+ typename detail::DictContainer<T>::type set;
100
+ std::cerr << " using " << typeid (set).name () << std::endl;
101
+ GenericArray<T> result;
102
+ result.reserve (size);
103
+
104
+ while (result.size () != size) {
105
+ T t = rnd.next (args...);
106
+ if (!set.count (t)) {
107
+ set.insert (t);
108
+ result.push_back (t);
109
+ }
110
+ }
111
+
112
+ return result;
118
113
}
119
114
120
115
template <typename T>
121
116
GenericArray<T> GenericArray<T>::id(size_t size, T start) {
122
- return genericArrayIdHelper<T>(size, start);
117
+ constexpr bool enable = std::is_integral<T>::value;
118
+ static_assert (enable, " Cannot call Array<T>::id with non-integral T" );
119
+
120
+ if (enable) {
121
+ GenericArray<T> result (size);
122
+ std::iota (result.begin (), result.end (), start);
123
+ return result;
124
+ } else {
125
+ return {};
126
+ }
123
127
}
124
128
125
129
template <typename T>
@@ -237,6 +241,7 @@ typedef GenericArray<double> Arrayf;
237
241
238
242
} // namespace impl
239
243
244
+ using impl::GenericArray;
240
245
using impl::Array;
241
246
using impl::Array64;
242
247
using impl::Arrayf;
0 commit comments