55 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef SUPPORT_USER_DEFINED_INTEGRAL_H10#define SUPPORT_USER_DEFINED_INTEGRAL_H11 12#include "test_macros.h"13 14template <class T>15struct UserDefinedIntegral16{17 TEST_CONSTEXPR_CXX14 UserDefinedIntegral() : value(0) {}18 TEST_CONSTEXPR_CXX14 UserDefinedIntegral(T v) : value(v) {}19 TEST_CONSTEXPR_CXX14 operator T() const { return value; }20 T value;21};22 23// Poison the arithmetic and comparison operations24template <class T, class U>25void operator+(UserDefinedIntegral<T>, UserDefinedIntegral<U>);26 27template <class T, class U>28void operator-(UserDefinedIntegral<T>, UserDefinedIntegral<U>);29 30template <class T, class U>31void operator*(UserDefinedIntegral<T>, UserDefinedIntegral<U>);32 33template <class T, class U>34void operator/(UserDefinedIntegral<T>, UserDefinedIntegral<U>);35 36template <class T, class U>37void operator==(UserDefinedIntegral<T>, UserDefinedIntegral<U>);38 39template <class T, class U>40void operator!=(UserDefinedIntegral<T>, UserDefinedIntegral<U>);41 42template <class T, class U>43void operator<(UserDefinedIntegral<T>, UserDefinedIntegral<U>);44 45template <class T, class U>46void operator>(UserDefinedIntegral<T>, UserDefinedIntegral<U>);47 48template <class T, class U>49void operator<=(UserDefinedIntegral<T>, UserDefinedIntegral<U>);50 51template <class T, class U>52void operator>=(UserDefinedIntegral<T>, UserDefinedIntegral<U>);53 54#endif // SUPPORT_USER_DEFINED_INTEGRAL_H55