summaryrefslogtreecommitdiffhomepage
path: root/dev/libSystem/SystemKit/Verify.h
blob: 5ad0dbff5d978d624569c442d400ee73c5b8226a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* -------------------------------------------

   Copyright (C) 2025, Amlal El Mahrouss, all rights reserved.

   File: Verify.h
   Purpose: System Call Interface Verification Layer.

   ------------------------------------------- */

#pragma once

#include <libSystem/SystemKit/System.h>

namespace LibSystem::Verify {
/// @author 0xf00sec, and Amlal El Mahrouss
/// @brief safe cast operator.
template <typename T, typename R = VoidPtr>
inline R sys_safe_cast(const T* ptr) {
  _rtl_assert(ptr, "safe cast failed!");
  return static_cast<R>(const_cast<T*>(ptr));
}

template <typename T, typename U>
struct must_cast_traits {
  constexpr static BOOL value = false;
};

template <typename T>
struct must_cast_traits<T, T> {
  constexpr static BOOL value = true;
};

/// @author Amlal El Mahrouss
/// @brief Safe constexpr cast.
template <typename T, typename R>
inline constexpr R* sys_constexpr_cast(T* ptr) {
  static_assert(must_cast_traits<T, R>::value, "constexpr cast failed! types are mismatching!");
  return static_cast<R*>(ptr);
}
}  // namespace LibSystem::Detail