1cc89063bSNico Weber //===----------------------------------------------------------------------===// 2cc89063bSNico Weber // 3cc89063bSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4cc89063bSNico Weber // See https://llvm.org/LICENSE.txt for license information. 5cc89063bSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6cc89063bSNico Weber // 7cc89063bSNico Weber //===----------------------------------------------------------------------===// 8*480cd780SLouis Dionne 9cc89063bSNico Weber #ifndef SUPPORT_USER_DEFINED_INTEGRAL_H 10cc89063bSNico Weber #define SUPPORT_USER_DEFINED_INTEGRAL_H 11cc89063bSNico Weber 1213c90a57SLouis Dionne #include "test_macros.h" 1313c90a57SLouis Dionne 14cc89063bSNico Weber template <class T> 15cc89063bSNico Weber struct UserDefinedIntegral 16cc89063bSNico Weber { UserDefinedIntegralUserDefinedIntegral1713c90a57SLouis Dionne TEST_CONSTEXPR_CXX14 UserDefinedIntegral() : value(0) {} UserDefinedIntegralUserDefinedIntegral1813c90a57SLouis Dionne TEST_CONSTEXPR_CXX14 UserDefinedIntegral(T v) : value(v) {} TUserDefinedIntegral1913c90a57SLouis Dionne TEST_CONSTEXPR_CXX14 operator T() const { return value; } 20cc89063bSNico Weber T value; 21cc89063bSNico Weber }; 22cc89063bSNico Weber 23cc89063bSNico Weber // Poison the arithmetic and comparison operations 24cc89063bSNico Weber template <class T, class U> 25cc89063bSNico Weber void operator+(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 26cc89063bSNico Weber 27cc89063bSNico Weber template <class T, class U> 28cc89063bSNico Weber void operator-(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 29cc89063bSNico Weber 30cc89063bSNico Weber template <class T, class U> 31cc89063bSNico Weber void operator*(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 32cc89063bSNico Weber 33cc89063bSNico Weber template <class T, class U> 34cc89063bSNico Weber void operator/(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 35cc89063bSNico Weber 36cc89063bSNico Weber template <class T, class U> 37cc89063bSNico Weber void operator==(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 38cc89063bSNico Weber 39cc89063bSNico Weber template <class T, class U> 40cc89063bSNico Weber void operator!=(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 41cc89063bSNico Weber 42cc89063bSNico Weber template <class T, class U> 43cc89063bSNico Weber void operator<(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 44cc89063bSNico Weber 45cc89063bSNico Weber template <class T, class U> 46cc89063bSNico Weber void operator>(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 47cc89063bSNico Weber 48cc89063bSNico Weber template <class T, class U> 49cc89063bSNico Weber void operator<=(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 50cc89063bSNico Weber 51cc89063bSNico Weber template <class T, class U> 52cc89063bSNico Weber void operator>=(UserDefinedIntegral<T>, UserDefinedIntegral<U>); 53cc89063bSNico Weber 54cc89063bSNico Weber #endif // SUPPORT_USER_DEFINED_INTEGRAL_H 55