KisaragiLibrary
 
読み取り中…
検索中…
一致する文字列を見つけられません
Kisaragi_Lib::LoopOutOfRange 構造体

範囲外が与えられたらループした値に戻す [詳解]

#include <RangeNum.hpp>

Kisaragi_Lib::LoopOutOfRange の継承関係図
Kisaragi_Lib::IOutOfRange

静的公開メンバ関数

template<typename T, std::enable_if_t< std::is_integral< T >::value, int > = 0>
static void Handle (T &_value, const T &_min, const T &_max)
 
template<typename T, std::enable_if_t< std::is_floating_point_v< T >, int > = 0>
static void Handle (T &_value, const T &_min, const T &_max)
 

詳解

範囲外が与えられたらループした値に戻す

から
1.1.1

関数詳解

◆ Handle() [1/2]

template<typename T, std::enable_if_t< std::is_integral< T >::value, int > = 0>
static void Kisaragi_Lib::LoopOutOfRange::Handle ( T & _value,
const T & _min,
const T & _max )
inlinestatic
81 {
82 T range = _max - _min + 1; // 範囲の幅 (max含む場合)
83
84 if (range <= 0)
85 {
86 return; // 範囲がおかしい場合は処理しない
87 }
88
89 auto positive_mod = [](T a, T b) -> T
90 {
91 T r = a % b;
92 return (r < 0) ? r + b : r;
93 };
94
95 // _value を _min から始まる範囲内にループさせる
96 _value = positive_mod(_value - _min, range) + _min;
97 }

◆ Handle() [2/2]

template<typename T, std::enable_if_t< std::is_floating_point_v< T >, int > = 0>
static void Kisaragi_Lib::LoopOutOfRange::Handle ( T & _value,
const T & _min,
const T & _max )
inlinestatic
102 {
103 T range = _max - _min;
104 if (range <= 0) return;
105
106 T offset = std::fmod(_value - _min, range);
107 if (offset < 0)
108 offset += range;
109
110 _value = _min + offset;
111 }

この構造体詳解は次のファイルから抽出されました: