Skip to content

Commit 6365b20

Browse files
author
Jeffrey Hurchalla
committed
fix the msvc fixes
1 parent 1615971 commit 6365b20

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

montgomery_arithmetic/include/hurchalla/montgomery_arithmetic/detail/experimental/unit_testing_helpers/ConcreteMontgomeryForm.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,39 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
4949
using U = typename extensible_make_unsigned<T>::type;
5050

5151
struct OpenV : public V {
52+
#ifndef _MSC_VER
53+
auto get() const -> decltype(V::get()) { return V::get(); }
5254
// for explanation of OT declaration, see
5355
// https://stackoverflow.com/questions/26435084/how-to-get-the-return-type-of-a-member-function-from-within-a-class
56+
using OT = decltype((std::declval<OpenV>().*std::declval<decltype(&OpenV::get)>())());
57+
#else
5458
using OT = decltype((std::declval<V>().*std::declval<decltype(&V::get)>())());
5559
OT get() const { return V::get(); }
60+
#endif
5661
OpenV() = default;
5762
explicit OpenV(OT a) : V(a) {}
5863
explicit OpenV(V x) : V(x) {}
5964
};
6065
struct OpenC : public C {
66+
#ifndef _MSC_VER
67+
auto get() const -> decltype(C::get()) { return C::get(); }
68+
using OT = decltype((std::declval<OpenC>().*std::declval<decltype(&OpenC::get)>())());
69+
#else
6170
using OT = decltype((std::declval<C>().*std::declval<decltype(&C::get)>())());
6271
OT get() const { return C::get(); }
72+
#endif
6373
OpenC() = default;
6474
explicit OpenC(OT a) : C(a) {}
6575
explicit OpenC(C x) : C(x) {}
6676
};
6777
struct OpenFV : public FV {
78+
#ifndef _MSC_VER
79+
auto get() const -> decltype(FV::get()) { return FV::get(); }
80+
using OT = decltype((std::declval<OpenFV>().*std::declval<decltype(&OpenFV::get)>())());
81+
#else
6882
using OT = decltype((std::declval<FV>().*std::declval<decltype(&FV::get)>())());
6983
OT get() const { return FV::get(); }
84+
#endif
7085
OpenFV() = default;
7186
explicit OpenFV(OT a) : FV(a) {}
7287
explicit OpenFV(FV x) : FV(x) {}
@@ -84,8 +99,13 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
8499

85100

86101
struct OpenMFV : public MFV {
102+
#ifndef _MSC_VER
103+
auto get() const -> decltype(MFV::get()) { return MFV::get(); }
104+
using OT = decltype((std::declval<OpenMFV>().*std::declval<decltype(&OpenMFV::get)>())());
105+
#else
87106
using OT = decltype((std::declval<MFV>().*std::declval<decltype(&MFV::get)>())());
88107
OT get() const { return MFV::get(); }
108+
#endif
89109
OpenMFV() = default;
90110
explicit OpenMFV(OT a) : MFV(a) {}
91111
explicit OpenMFV(MFV x) : MFV(x) {}
@@ -105,8 +125,13 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
105125
}
106126
};
107127
struct OpenMFC : public MFC {
128+
#ifndef _MSC_VER
129+
auto get() const -> decltype(MFC::get()) { return MFC::get(); }
130+
using OT = decltype((std::declval<OpenMFC>().*std::declval<decltype(&OpenMFC::get)>())());
131+
#else
108132
using OT = decltype((std::declval<MFC>().*std::declval<decltype(&MFC::get)>())());
109133
OT get() const { return MFC::get(); }
134+
#endif
110135
OpenMFC() = default;
111136
explicit OpenMFC(OT a) : MFC(a) {}
112137
explicit OpenMFC(MFC x) : MFC(x) {}
@@ -126,8 +151,13 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
126151
}
127152
};
128153
struct OpenMFFV : public MFFV {
154+
#ifndef _MSC_VER
155+
auto get() const -> decltype(MFFV::get()) { return MFFV::get(); }
156+
using OT = decltype((std::declval<OpenMFFV>().*std::declval<decltype(&OpenMFFV::get)>())());
157+
#else
129158
using OT = decltype((std::declval<MFFV>().*std::declval<decltype(&MFFV::get)>())());
130159
OT get() const { return MFFV::get(); }
160+
#endif
131161
OpenMFFV() = default;
132162
explicit OpenMFFV(OT a) : MFFV(a) {}
133163
explicit OpenMFFV(MFFV x) : MFFV(x) {}

montgomery_arithmetic/include/hurchalla/montgomery_arithmetic/detail/impl_montgomery_two_pow.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ struct impl_montgomery_two_pow {
8484
HPBC_ASSERT2(numbits > P2);
8585

8686
int shift = numbits - P2;
87-
U tmp = n >> shift;
87+
U tmp = static_cast<U>(n >> shift);
8888
HPBC_ASSERT2(tmp <= MASK);
8989
size_t index = static_cast<size_t>(tmp);
9090
V result = MFE::twoPowLimited(mf, index);
@@ -130,7 +130,7 @@ struct impl_montgomery_two_pow {
130130
HPBC_ASSERT2(numbits > (P2 + 1));
131131

132132
int shift = numbits - (P2 + 1);
133-
U tmp = n >> shift;
133+
U tmp = static_cast<U>(n >> shift);
134134
HPBC_ASSERT2(tmp <= 2u*MASK + 1u);
135135
size_t loindex = static_cast<size_t>(tmp) & MASK;
136136
V val1 = MFE::RTimesTwoPowLimited(mf, loindex, magicValue);
@@ -145,7 +145,7 @@ struct impl_montgomery_two_pow {
145145
}
146146
}
147147
shift -= (P2 + 1);
148-
tmp = n >> shift;
148+
tmp = static_cast<U>(n >> shift);
149149
loindex = static_cast<size_t>(tmp) & MASK;
150150
val1 = MFE::RTimesTwoPowLimited(mf, loindex, magicValue);
151151
val2 = MFE::twoPowLimited(mf, loindex);
@@ -236,7 +236,7 @@ struct impl_montgomery_two_pow {
236236
std::array<V, ARRAY_SIZE> result;
237237
std::array<U, ARRAY_SIZE> tmp;
238238
HURCHALLA_REQUEST_UNROLL_LOOP for (size_t j=0; j<ARRAY_SIZE; ++j) {
239-
tmp[j] = n[j] >> shift;
239+
tmp[j] = static_cast<U>(n[j] >> shift);
240240
HPBC_ASSERT2(tmp[j] <= MASK);
241241
// normally we use (tmp & MASK), but it's redundant with tmp <= MASK
242242
result[j] = MFE::twoPowLimited(mf[j], static_cast<size_t>(tmp[j]));
@@ -247,7 +247,7 @@ struct impl_montgomery_two_pow {
247247
std::array<size_t, ARRAY_SIZE> index;
248248
std::array<V, ARRAY_SIZE> tableVal;
249249
HURCHALLA_REQUEST_UNROLL_LOOP for (size_t j=0; j<ARRAY_SIZE; ++j) {
250-
tmp[j] = n[j] >> shift;
250+
tmp[j] = static_cast<U>(n[j] >> shift);
251251
index[j] = static_cast<size_t>(tmp[j]) & MASK;
252252
tableVal[j] = MFE::twoPowLimited(mf[j], index[j]);
253253
}
@@ -306,7 +306,7 @@ struct impl_montgomery_two_pow {
306306

307307
std::array<V, ARRAY_SIZE> result;
308308
HURCHALLA_REQUEST_UNROLL_LOOP for (size_t j=0; j<ARRAY_SIZE; ++j) {
309-
U tmp = n[j] >> shift;
309+
U tmp = static_cast<U>(n[j] >> shift);
310310
HPBC_ASSERT2(tmp <= MASK);
311311
size_t index = static_cast<size_t>(tmp);
312312
result[j] = table[index][j];

0 commit comments

Comments
 (0)