xref: /aosp_15_r20/external/llvm-libc/src/__support/sign.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- A simple sign type --------------------------------------*- C++ -*-===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #ifndef LLVM_LIBC_SRC___SUPPORT_SIGN_H
10*71db0c75SAndroid Build Coastguard Worker #define LLVM_LIBC_SRC___SUPPORT_SIGN_H
11*71db0c75SAndroid Build Coastguard Worker 
12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/attributes.h" // LIBC_INLINE, LIBC_INLINE_VAR
13*71db0c75SAndroid Build Coastguard Worker 
14*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL {
15*71db0c75SAndroid Build Coastguard Worker 
16*71db0c75SAndroid Build Coastguard Worker // A type to interact with signed arithmetic types.
17*71db0c75SAndroid Build Coastguard Worker struct Sign {
is_posSign18*71db0c75SAndroid Build Coastguard Worker   LIBC_INLINE constexpr bool is_pos() const { return !is_negative; }
is_negSign19*71db0c75SAndroid Build Coastguard Worker   LIBC_INLINE constexpr bool is_neg() const { return is_negative; }
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker   LIBC_INLINE friend constexpr bool operator==(Sign a, Sign b) {
22*71db0c75SAndroid Build Coastguard Worker     return a.is_negative == b.is_negative;
23*71db0c75SAndroid Build Coastguard Worker   }
24*71db0c75SAndroid Build Coastguard Worker 
25*71db0c75SAndroid Build Coastguard Worker   LIBC_INLINE friend constexpr bool operator!=(Sign a, Sign b) {
26*71db0c75SAndroid Build Coastguard Worker     return !(a == b);
27*71db0c75SAndroid Build Coastguard Worker   }
28*71db0c75SAndroid Build Coastguard Worker 
29*71db0c75SAndroid Build Coastguard Worker   static const Sign POS;
30*71db0c75SAndroid Build Coastguard Worker   static const Sign NEG;
31*71db0c75SAndroid Build Coastguard Worker 
32*71db0c75SAndroid Build Coastguard Worker private:
SignSign33*71db0c75SAndroid Build Coastguard Worker   LIBC_INLINE constexpr explicit Sign(bool is_negative)
34*71db0c75SAndroid Build Coastguard Worker       : is_negative(is_negative) {}
35*71db0c75SAndroid Build Coastguard Worker 
36*71db0c75SAndroid Build Coastguard Worker   bool is_negative;
37*71db0c75SAndroid Build Coastguard Worker };
38*71db0c75SAndroid Build Coastguard Worker 
39*71db0c75SAndroid Build Coastguard Worker LIBC_INLINE_VAR constexpr Sign Sign::NEG = Sign(true);
40*71db0c75SAndroid Build Coastguard Worker LIBC_INLINE_VAR constexpr Sign Sign::POS = Sign(false);
41*71db0c75SAndroid Build Coastguard Worker 
42*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL
43*71db0c75SAndroid Build Coastguard Worker #endif // LLVM_LIBC_SRC___SUPPORT_SIGN_H
44