Commit 5929a0ab authored by Lukas Tietze's avatar Lukas Tietze

Fix und Kommentare

parent b9b95dd1
......@@ -28,57 +28,83 @@ namespace lib
};
/**
* @brief type trait um zu prüfen ob ein Typ ein Iterator ist.
* @brief Kurzform von is_iterator<T>::value.
*
* @tparam T Der zu prüfende Typ.
*/
template <typename T>
static constexpr auto is_iterator_v = lib::is_iterator<T>::value;
// ---------------------------------------------------------------------------------------------------------------
// is_iterable
// ---------------------------------------------------------------------------------------------------------------
/**
* @brief Prüft ob der gegebene Typ iterierbar ist, d.h. ob std::begin(t) und std::end(t) definiert sind
* und damit indirekt, ob T::begin() und T::end() definiert sind.
*
* @tparam T Der zu prüfende Typ.
*/
template <typename T, typename = void>
struct is_iterable
{
static constexpr bool value = false;
};
/**
* @brief Prüft ob der gegebene Typ iterierbar ist, d.h. ob std::begin(t) und std::end(t) definiert sind
* und damit indirekt, ob T::begin() und T::end() definiert sind.
*
* @tparam T Der zu prüfende Typ.
*/
template <typename T>
struct is_iterable<T, typename std::enable_if<
std::is_same<
decltype(std::cbegin(std::declval<T>())),
decltype(std::cend(std::declval<T>()))>::value &&
lib::is_iterator<decltype(std::cbegin(std::declval<T>()))>::value &&
lib::is_iterator<decltype(std::cend(std::declval<T>()))>::value>::type>
decltype(std::begin(std::declval<T>())),
decltype(std::end(std::declval<T>()))>::value &&
lib::is_iterator<decltype(std::begin(std::declval<T>()))>::value &&
lib::is_iterator<decltype(std::end(std::declval<T>()))>::value>::type>
{
static constexpr bool value = true;
};
/**
* @brief Kurzform von is_iterable<T>::value.
*
* @tparam T Der zu prüfende Typ.
*/
template <typename T>
static constexpr auto is_iterable_v = lib::is_iterable<T>::value;
// ---------------------------------------------------------------------------------------------------------------
// is_contiguos_memory
// ---------------------------------------------------------------------------------------------------------------
/**
* @brief Prüft ob ein Typ einen kontinuierlichen Speicher darstellt. Dies ist der Fall wenn der Container
* die Funktionen PointerType T::data() const und IntegralType T::size() const definiert.
*
* @tparam T Der zu prüfende Typ.
*/
template <typename T, typename = void>
struct is_contiguos_memory
{
static constexpr bool value = false;
};
/**
* @brief Prüft ob ein Typ einen kontinuierlichen Speicher darstellt. Dies ist der Fall wenn der Container
* die Funktionen PointerType T::data() const und IntegralType T::size() const definiert.
*
* @tparam T Der zu prüfende Typ.
*/
template <typename T>
struct is_contiguos_memory<
T,
typename std::enable_if<
std::is_pointer<decltype(std::declval<T>().data())>::value &&
std::is_integral<decltype(std::declval<std::vector<int>>().size())>::value>::type>
std::is_integral<decltype(std::declval<T>().size())>::value>::type>
{
static constexpr bool value = true;
};
/**
* @brief Kurzform von is_contiguos_memory<T>::value
*
* @tparam T Der zu prüfende Typ.
*/
template <typename T>
static constexpr auto is_contiguos_memory_v = is_contiguos_memory<T>::value;
} // namespace lib
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment