tatami
C++ API for different matrix representations
Loading...
Searching...
No Matches
Index_to_container.hpp
1#ifndef TATAMI_INDEX_TO_CONTAINER_HPP
2#define TATAMI_INDEX_TO_CONTAINER_HPP
3
4#include <type_traits>
5#include <limits>
6#include <cstddef>
7
8#include "sanisizer/sanisizer.hpp"
9
10#include "copy.hpp"
11
12namespace tatami {
13
17template<typename Left_, typename Right_> // provided only for back-compatibility.
18bool safe_non_negative_equal(const Left_ l, const Right_ r) {
19 return l >= 0 && r >= 0 && sanisizer::is_equal(l, r);
20}
35template<typename Container_, typename Index_>
36Index_ can_cast_Index_to_container_size(const Index_ x) {
37 // If the Index_ type is larger than size_t, we cast it to size_t to provide can_cast() with some opportunities for compile-time optimization.
38 // This is because we know that all uses of Index_ must fit into a size_t in order for the Extractor::fetch calls to address the user-supplied arrays.
39 // By casting away larger types, we allow can_cast() to eliminate the run-time overflow checks completely.
40 typedef typename std::conditional<std::numeric_limits<std::size_t>::max() < std::numeric_limits<Index_>::max(), std::size_t, Index_>::type Intermediate;
41 sanisizer::can_cast<I<decltype(std::declval<Container_>().size())> >(static_cast<Intermediate>(x));
42 return x;
43}
44
55template<typename Container_, typename Index_>
56I<decltype(std::declval<Container_>().size())> cast_Index_to_container_size(const Index_ x) {
58}
59
72template<typename Container_, typename Index_, typename ... Args_>
73Container_ create_container_of_Index_size(const Index_ x, Args_&& ... args) {
74 // Same logic as described above.
75 typedef typename std::conditional<std::numeric_limits<std::size_t>::max() < std::numeric_limits<Index_>::max(), std::size_t, Index_>::type Intermediate;
76 return sanisizer::create<Container_>(static_cast<Intermediate>(x), std::forward<Args_>(args)...);
77}
78
91template<typename Container_, typename Index_, typename ... Args_>
92void resize_container_to_Index_size(Container_& container, const Index_ x, Args_&& ... args) {
93 container.resize(cast_Index_to_container_size<Container_>(x), std::forward<Args_>(args)...);
94}
95
96}
97
98#endif
Copy data from one buffer to another.
Flexible representations for matrix data.
Definition Extractor.hpp:15
Index_ can_cast_Index_to_container_size(const Index_ x)
Definition Index_to_container.hpp:36
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
Definition Index_to_container.hpp:92
I< decltype(std::declval< Container_ >().size())> cast_Index_to_container_size(const Index_ x)
Definition Index_to_container.hpp:56
Container_ create_container_of_Index_size(const Index_ x, Args_ &&... args)
Definition Index_to_container.hpp:73