blob: a313fe6de1f0d46c2875227dbb6b7f888a1a3fd0 [file] [log] [blame]
Eric Fiselier38236b52016-01-19 21:52:04 +00001//===----------------------------------------------------------------------===//
2//
Chandler Carruth57b08b02019-01-19 10:56:40 +00003// 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-exception
Eric Fiselier38236b52016-01-19 21:52:04 +00006//
7//===----------------------------------------------------------------------===//
Eric Fiselier51544022015-02-10 16:46:42 +00008#ifndef SUPPORT_USER_DEFINED_INTEGRAL_HPP
9#define SUPPORT_USER_DEFINED_INTEGRAL_HPP
10
11template <class T>
12struct UserDefinedIntegral
13{
14 UserDefinedIntegral() : value(0) {}
15 UserDefinedIntegral(T v) : value(v) {}
16 operator T() const { return value; }
17 T value;
18};
19
20// Poison the arithmetic and comparison operations
21template <class T, class U>
22void operator+(UserDefinedIntegral<T>, UserDefinedIntegral<U>);
23
24template <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
51#endif // SUPPORT_USER_DEFINED_INTEGRAL_HPP