17 template <
typename SrcScalar,
typename TgtScalar,
typename EnableIf =
void>
19 static SrcScalar
value() {
return internal::random<SrcScalar>(); }
23 template <
typename SrcScalar,
typename TgtScalar>
26 typename
internal::
enable_if<NumTraits<SrcScalar>::IsInteger && NumTraits<TgtScalar>::IsInteger &&
27 !NumTraits<TgtScalar>::IsSigned &&
28 (std::numeric_limits<SrcScalar>::digits < std::numeric_limits<TgtScalar>::digits ||
29 (std::numeric_limits<SrcScalar>::digits == std::numeric_limits<TgtScalar>::digits &&
30 NumTraits<SrcScalar>::IsSigned))>::type> {
32 SrcScalar
a = internal::random<SrcScalar>();
33 return a < SrcScalar(0) ? -(
a + 1) :
a;
38 template <
typename SrcScalar,
typename TgtScalar>
42 NumTraits<SrcScalar>::IsInteger && NumTraits<TgtScalar>::IsInteger && !NumTraits<SrcScalar>::IsSigned &&
43 (std::numeric_limits<SrcScalar>::digits > std::numeric_limits<TgtScalar>::digits)>
::type> {
45 TgtScalar
b = internal::random<TgtScalar>();
46 return static_cast<SrcScalar
>(
b < TgtScalar(0) ? -(
b + 1) :
b);
51 template <
typename SrcScalar,
typename TgtScalar>
55 NumTraits<SrcScalar>::IsInteger && NumTraits<TgtScalar>::IsInteger && NumTraits<SrcScalar>::IsSigned &&
56 (std::numeric_limits<SrcScalar>::digits > std::numeric_limits<TgtScalar>::digits)>
::type> {
57 static SrcScalar
value() {
return static_cast<SrcScalar
>(internal::random<TgtScalar>()); }
61 template <
typename SrcScalar,
typename TgtScalar>
64 typename
internal::
enable_if<NumTraits<SrcScalar>::IsInteger && NumTraits<TgtScalar>::IsInteger &&
65 !NumTraits<SrcScalar>::IsSigned && NumTraits<TgtScalar>::IsSigned &&
66 (std::numeric_limits<SrcScalar>::digits ==
67 std::numeric_limits<TgtScalar>::digits)>
::type> {
68 static SrcScalar
value() {
return internal::random<SrcScalar>() / 2; }
72 template <
typename SrcScalar,
typename TgtScalar>
76 !NumTraits<SrcScalar>::IsInteger && !NumTraits<SrcScalar>::IsComplex && NumTraits<TgtScalar>::IsInteger &&
77 (std::numeric_limits<TgtScalar>::digits <= std::numeric_limits<SrcScalar>::digits)>::type> {
78 static SrcScalar
value() {
return static_cast<SrcScalar
>(internal::random<TgtScalar>()); }
82 template <
typename SrcScalar,
typename TgtScalar>
83 struct random_without_cast_overflow<
86 !NumTraits<SrcScalar>::IsInteger && !NumTraits<SrcScalar>::IsComplex && NumTraits<TgtScalar>::IsInteger &&
87 (std::numeric_limits<TgtScalar>::digits > std::numeric_limits<SrcScalar>::digits)>
::type> {
92 static const TgtScalar KeepMask = (
static_cast<TgtScalar
>(1) << std::numeric_limits<SrcScalar>::digits) - 1;
93 const TgtScalar
a = internal::random<TgtScalar>();
94 return static_cast<SrcScalar
>(
a > TgtScalar(0) ? (
a & KeepMask) : -(
a & KeepMask));
99 template <
typename SrcScalar,
typename TgtScalar>
101 SrcScalar, TgtScalar,
102 typename
internal::
enable_if<NumTraits<SrcScalar>::IsInteger && !NumTraits<TgtScalar>::IsInteger &&
103 !NumTraits<TgtScalar>::IsComplex>
::type> {
110 template <
typename SrcScalar,
typename TgtScalar>
111 struct random_without_cast_overflow<
112 SrcScalar, TgtScalar,
113 typename
internal::enable_if<!NumTraits<SrcScalar>::IsInteger && !NumTraits<SrcScalar>::IsComplex &&
114 !NumTraits<TgtScalar>::IsInteger && !NumTraits<TgtScalar>::IsComplex &&
115 (std::numeric_limits<SrcScalar>::digits >
116 std::numeric_limits<TgtScalar>::digits)>
::type> {
117 static SrcScalar
value() {
return static_cast<SrcScalar
>(internal::random<TgtScalar>()); }
121 template <
typename SrcScalar,
typename TgtScalar>
123 SrcScalar, TgtScalar,
130 template <
typename SrcScalar,
typename TgtScalar>
132 SrcScalar, TgtScalar,
139 template <
typename SrcScalar,
typename TgtScalar>
141 SrcScalar, TgtScalar,