@@ -251,77 +251,145 @@ constexpr auto make_unordered_map(
251251 return unordered_map<T, U, N, Hasher, Equal>{items, hash, equal};
252252}
253253
254- template <typename T, typename U, typename Hasher, typename Equal, std::size_t ... KNs,
255- std::enable_if_t <
256- !bits::has_type<bits::element_type<U>>::value
257- && !bits::is_pair<Hasher>::value
258- && !bits::is_pair<Equal>::value>* = nullptr >
254+ template <
255+ typename T
256+ , typename U
257+ , typename Hasher
258+ , typename Equal
259+ , typename ElemT
260+ , std::enable_if_t <
261+ !bits::has_type<bits::element_type<U>>::value
262+ && !bits::is_pair<Hasher>::value
263+ && !bits::is_pair<Equal>::value
264+ && std::is_same<ElemT, bits::element_t <T>>::value
265+ , std::size_t >... KNs
266+ >
259267constexpr auto make_unordered_map (
260268 Hasher const &hash,
261269 Equal const &equal,
262270 std::pair<
263- bits::element_t <T> const (&)[ KNs]
271+ bits::array_ref< const ElemT, KNs>
264272 , U> const &... items) {
265273 constexpr const auto key_storage_size = bits::accumulate ({KNs...});
266274 using container_type = bits::pic_array<std::pair<const T, U>, sizeof ...(KNs), key_storage_size>;
267- return unordered_map<T, U, sizeof ...(KNs), Hasher, Equal, container_type>{container_type{items...}, hash, equal};
275+ using value_type = typename container_type::value_type;
276+ return unordered_map<T, U, sizeof ...(KNs), Hasher, Equal, container_type>{
277+ container_type{value_type (T (items.first .array ), U (items.second ))...},
278+ hash,
279+ equal,
280+ };
268281}
269282
270- template <typename T, typename U, std::size_t ... KNs,
271- std::enable_if_t <!bits::has_type<bits::element_type<U>>::value>* = nullptr >
283+ template <
284+ typename T
285+ , typename U
286+ , typename ElemT
287+ , std::enable_if_t <
288+ !bits::has_type<bits::element_type<U>>::value
289+ && std::is_same<ElemT, bits::element_t <T>>::value
290+ , std::size_t >... KNs
291+ >
272292constexpr auto make_unordered_map (
273293 std::pair<
274- bits::element_t <T> const (&)[ KNs]
294+ bits::array_ref< const ElemT, KNs>
275295 , U> const &... items) {
276296 return make_unordered_map<T, U>(anna<T>{}, std::equal_to<T>{}, items...);
277297}
278298
279- template <typename T, typename U, typename Hasher, typename Equal, std::size_t ... VNs,
280- std::enable_if_t <
281- !bits::has_type<bits::element_type<T>>::value
282- && !bits::is_pair<Hasher>::value
283- && !bits::is_pair<Equal>::value>* = nullptr >
299+ template <
300+ typename T
301+ , typename U
302+ , typename Hasher
303+ , typename Equal
304+ , typename ElemT
305+ , std::enable_if_t <
306+ !bits::has_type<bits::element_type<T>>::value
307+ && !bits::is_pair<Hasher>::value
308+ && !bits::is_pair<Equal>::value
309+ && std::is_same<ElemT, bits::element_t <U>>::value
310+ , std::size_t >... VNs
311+ >
284312constexpr auto make_unordered_map (
285313 Hasher const &hash,
286314 Equal const &equal,
287315 std::pair<
288316 T
289- , bits::element_t <U> const (&)[ VNs]
317+ , bits::array_ref< const ElemT, VNs>
290318 > const &... items) {
291319 constexpr const auto val_storage_size = bits::accumulate ({VNs...});
292320 using container_type = bits::pic_array<std::pair<const T, U>, sizeof ...(VNs), val_storage_size>;
293- return unordered_map<T, U, sizeof ...(VNs), Hasher, Equal, container_type>{container_type{items...}, hash, equal};
321+ using value_type = typename container_type::value_type;
322+ return unordered_map<T, U, sizeof ...(VNs), Hasher, Equal, container_type>{
323+ container_type{value_type (T (items.first ), U (items.second .array ))...},
324+ hash,
325+ equal,
326+ };
294327}
295328
296- template <typename T, typename U, std::size_t ... VNs,
297- std::enable_if_t <!bits::has_type<bits::element_type<T>>::value>* = nullptr >
329+ template <
330+ typename T
331+ , typename U
332+ , typename ElemT
333+ , std::enable_if_t <
334+ !bits::has_type<bits::element_type<T>>::value
335+ && std::is_same<ElemT, bits::element_t <U>>::value
336+ , std::size_t >... VNs
337+ >
298338constexpr auto make_unordered_map (
299339 std::pair<
300340 T
301- , bits::element_t <U> const (&)[ VNs]
341+ , bits::array_ref< const ElemT, VNs>
302342 > const &... items) {
303343 return make_unordered_map<T, U>(anna<T>{}, std::equal_to<T>{}, items...);
304344}
305345
306- template <typename T, typename U, typename Hasher, typename Equal, std::size_t ... KNs, std::size_t ... VNs,
307- std::enable_if_t <!bits::is_pair<Hasher>::value && !bits::is_pair<Equal>::value>* = nullptr >
346+ template <
347+ typename T
348+ , typename U
349+ , typename Hasher
350+ , typename Equal
351+ , typename ElemT
352+ , typename ElemU
353+ , std::size_t ... KNs
354+ , std::enable_if_t <
355+ !bits::is_pair<Hasher>::value
356+ && !bits::is_pair<Equal>::value
357+ && std::is_same<ElemT, bits::element_t <T>>::value
358+ && std::is_same<ElemU, bits::element_t <U>>::value
359+ , std::size_t >... VNs
360+ >
308361constexpr auto make_unordered_map (
309362 Hasher const &hash,
310363 Equal const &equal,
311364 std::pair<
312- bits::element_t <T> const (&)[ KNs]
313- , bits::element_t<U> const (&)[ VNs]
365+ bits::array_ref< const ElemT, KNs>
366+ , bits::array_ref< const ElemU, VNs>
314367 > const &... items) {
315368 constexpr const auto key_storage_size = bits::accumulate ({KNs...});
316369 constexpr const auto val_storage_size = bits::accumulate ({VNs...});
317370 using container_type = bits::pic_array<std::pair<const T, U>, sizeof ...(KNs), key_storage_size + val_storage_size>;
318- return unordered_map<T, U, sizeof ...(KNs), Hasher, Equal, container_type>{container_type{items...}, hash, equal};
371+ using value_type = typename container_type::value_type;
372+ return unordered_map<T, U, sizeof ...(KNs), Hasher, Equal, container_type>{
373+ container_type{value_type (T (items.first .array ), U (items.second .array ))...},
374+ hash,
375+ equal,
376+ };
319377}
320378
321- template <typename T, typename U, std::size_t ... KNs, std::size_t ... VNs>
379+ template <
380+ typename T
381+ , typename U
382+ , typename ElemT
383+ , typename ElemU
384+ , std::size_t ... KNs
385+ , std::enable_if_t <
386+ std::is_same<ElemT, bits::element_t <T>>::value
387+ && std::is_same<ElemU, bits::element_t <U>>::value
388+ , std::size_t >... VNs
389+ >
322390constexpr auto make_unordered_map (std::pair<
323- bits::element_t <T> const (&)[ KNs]
324- , bits::element_t<U> const (&)[ VNs]
391+ bits::array_ref< const ElemT, KNs>
392+ , bits::array_ref< const ElemU, VNs>
325393 > const &... items) {
326394 return make_unordered_map<T, U>(anna<T>{}, std::equal_to<T>{}, items...);
327395}
0 commit comments