Skip to content
This repository was archived by the owner on Jun 22, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions ClickHouse.Client.Tests/Numerics/ClickHouseInt128Tests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.Numerics;
using ClickHouse.Client.Numerics;

namespace ClickHouse.Client.Tests.Numerics;

public class ClickHouseInt128Tests
{
public static BigInteger MaxValue = BigInteger.Parse("170141183460469231731687303715884105727");
public static BigInteger MinValue = BigInteger.Parse("-170141183460469231731687303715884105728");

public static IEnumerable<BigInteger> Fibonacci
{
get
{
// Base cases
yield return 0;
yield return 1;
yield return int.MaxValue;
yield return uint.MaxValue;
yield return long.MaxValue;
yield return ulong.MaxValue;

// Fibonacci sequence for very large numbers
bool setLeft = false;
BigInteger right = 1;
BigInteger left = 0;
while (true)
{
var sum = left + right;
if (sum > MaxValue)
yield break;
yield return sum;
if (setLeft)
left = sum;
else
right = sum;
setLeft = !setLeft;
}
}
}

[Test]
[TestCaseSource(nameof(Fibonacci))]
public void ShouldRoundtripConvert(BigInteger input)
{
var int128 = new ClickHouseInt128(input);
var roundtrip = (BigInteger)int128;
Assert.That(roundtrip, Is.EqualTo(input));
}

[Test]
[TestCaseSource(nameof(Fibonacci))]
public void ShouldCompareEquality(BigInteger input)
{
var value1 = new ClickHouseInt128(input);
var value2 = new ClickHouseInt128(input + 1);
var value3 = new ClickHouseInt128(input);
Assert.That(value1, Is.Not.EqualTo(value2));
Assert.That(value1, Is.EqualTo(value3));
}

[Test]
[TestCaseSource(nameof(Fibonacci))]
public void ShouldIncrement(BigInteger input)
{
var value = new ClickHouseInt128(input);
value++;
Assert.That((BigInteger)value, Is.EqualTo(input + 1));
}

[Test]
public void ShouldHaveCorrectExtremeValues()
{
Assert.That((BigInteger)ClickHouseInt128.MaxValue, Is.EqualTo(MaxValue));
Assert.That((BigInteger)ClickHouseInt128.MinValue, Is.EqualTo(MinValue));
}
}
27 changes: 13 additions & 14 deletions ClickHouse.Client/FeatureSwitch.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
using System;

namespace ClickHouse.Client
namespace ClickHouse.Client;

internal class FeatureSwitch
{
internal class FeatureSwitch
{
private const string Prefix = "ClickHouse.Client.";
private const string Prefix = "ClickHouse.Client.";

public static readonly bool DisableReplacingParameters;
public static readonly bool DisableReplacingParameters;

static FeatureSwitch()
{
DisableReplacingParameters = GetSwitchValue(nameof(DisableReplacingParameters));
}
static FeatureSwitch()
{
DisableReplacingParameters = GetSwitchValue(nameof(DisableReplacingParameters));
}

private static bool GetSwitchValue(string switchName)
{
AppContext.TryGetSwitch(Prefix + switchName, out bool switchValue);
return switchValue;
}
private static bool GetSwitchValue(string switchName)
{
AppContext.TryGetSwitch(Prefix + switchName, out bool switchValue);
return switchValue;
}
}
236 changes: 236 additions & 0 deletions ClickHouse.Client/Numerics/ClickHouseInt128.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
using System;
using System.Globalization;
using System.Numerics;
using System.Runtime.InteropServices;

namespace ClickHouse.Client.Numerics;

[StructLayout(LayoutKind.Sequential)]
public readonly struct ClickHouseInt128

Check warning on line 9 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View workflow job for this annotation

GitHub Actions / Short

'ClickHouseInt128' defines operator == or operator != but does not override Object.GetHashCode()

Check warning on line 9 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View workflow job for this annotation

GitHub Actions / Short

'ClickHouseInt128' overrides Object.Equals(object o) but does not override Object.GetHashCode()
:
#if NET8_0_OR_GREATER
ISignedNumber<ClickHouseInt128>,
IMinMaxValue<ClickHouseInt128>,
// IBinaryInteger<ClickHouseInt128>,
// IUtf8SpanFormattable,
// IBinaryIntegerParseAndFormatInfo<ClickHouseInt128>
#endif
IEquatable<ClickHouseInt128>,
IComparable<ClickHouseInt128>
{
#if BIGENDIAN
private readonly ulong upper;
private readonly ulong lower;
#else
private readonly ulong lower;
private readonly ulong upper;
#endif

#if NET8_0_OR_GREATER
public ClickHouseInt128(Int128 value)
{

}

Check warning on line 33 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L33

Added line #L33 was not covered by tests
#endif

public ClickHouseInt128(ulong lower)
{
this.upper = 0;
this.lower = lower;
}

public ClickHouseInt128(ulong upper, ulong lower)
{
this.upper = upper;
this.lower = lower;
}

// Very slow and unoptimized constructor - used only for testing/comparison purposes
public ClickHouseInt128(BigInteger value)
{
var bytes = value.ToByteArray();
var int128bytes = new byte[16];
if (value.Sign < 0)
{
int128bytes.AsSpan().Fill(byte.MaxValue);

Check warning on line 55 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L55

Added line #L55 was not covered by tests
}
else
{
int128bytes.AsSpan().Clear();
}

if (bytes.Length > 16)
throw new OverflowException("Value is too large to fit in ClickHouseInt128.");

Check warning on line 63 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L63

Added line #L63 was not covered by tests

bytes.CopyTo(int128bytes.AsSpan());

lower = BitConverter.ToUInt64(int128bytes, 0);
upper = BitConverter.ToUInt64(int128bytes, 8);
}

public static ClickHouseInt128 NegativeOne => new(ulong.MaxValue, ulong.MaxValue);

Check warning on line 71 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L71

Added line #L71 was not covered by tests

public static ClickHouseInt128 One => new(1);

public static int Radix => 2;

Check warning on line 75 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L75

Added line #L75 was not covered by tests

public static ClickHouseInt128 Zero => new(0);

Check warning on line 77 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L77

Added line #L77 was not covered by tests

public static ClickHouseInt128 AdditiveIdentity => default;

Check warning on line 79 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L79

Added line #L79 was not covered by tests

public static ClickHouseInt128 MultiplicativeIdentity => One;

Check warning on line 81 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L81

Added line #L81 was not covered by tests

internal ulong Lower => lower;

internal ulong Upper => upper;

public static ClickHouseInt128 MaxValue => new(long.MaxValue, ulong.MaxValue);

public static ClickHouseInt128 MinValue => new(0x8000_0000_0000_0000, 0);

public static ClickHouseInt128 Abs(ClickHouseInt128 value) => throw new NotImplementedException();

Check warning on line 91 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L91

Added line #L91 was not covered by tests

public static bool IsCanonical(ClickHouseInt128 value) => true;

Check warning on line 93 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L93

Added line #L93 was not covered by tests

public static bool IsComplexNumber(ClickHouseInt128 value) => false;

Check warning on line 95 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L95

Added line #L95 was not covered by tests

public static bool IsEvenInteger(ClickHouseInt128 value) => (value.lower & 1) == 0;

Check warning on line 97 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L97

Added line #L97 was not covered by tests

public static bool IsFinite(ClickHouseInt128 value) => true;

Check warning on line 99 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L99

Added line #L99 was not covered by tests

public static bool IsImaginaryNumber(ClickHouseInt128 value) => false;

Check warning on line 101 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L101

Added line #L101 was not covered by tests

public static bool IsInfinity(ClickHouseInt128 value) => false;

Check warning on line 103 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L103

Added line #L103 was not covered by tests

public static bool IsInteger(ClickHouseInt128 value) => true;

Check warning on line 105 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L105

Added line #L105 was not covered by tests

public static bool IsNaN(ClickHouseInt128 value) => false;

Check warning on line 107 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L107

Added line #L107 was not covered by tests

public static bool IsNegative(ClickHouseInt128 value) => (long)value.Upper < 0;

Check warning on line 109 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L109

Added line #L109 was not covered by tests

public static bool IsNegativeInfinity(ClickHouseInt128 value) => false;

Check warning on line 111 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L111

Added line #L111 was not covered by tests

public static bool IsNormal(ClickHouseInt128 value) => throw new NotImplementedException();

Check warning on line 113 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L113

Added line #L113 was not covered by tests

public static bool IsOddInteger(ClickHouseInt128 value) => (value.lower & 1) != 0;

Check warning on line 115 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L115

Added line #L115 was not covered by tests

public static bool IsPositive(ClickHouseInt128 value) => (long)value.Upper > 0;

Check warning on line 117 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L117

Added line #L117 was not covered by tests

public static bool IsPositiveInfinity(ClickHouseInt128 value) => false;

Check warning on line 119 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L119

Added line #L119 was not covered by tests

public static bool IsRealNumber(ClickHouseInt128 value) => true;

Check warning on line 121 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L121

Added line #L121 was not covered by tests

public static bool IsSubnormal(ClickHouseInt128 value) => false;

Check warning on line 123 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L123

Added line #L123 was not covered by tests

public static bool IsZero(ClickHouseInt128 value) => value.Upper == 0 && value.Lower == 0;

public static ClickHouseInt128 MaxMagnitude(ClickHouseInt128 x, ClickHouseInt128 y) => throw new NotImplementedException();

Check warning on line 127 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L127

Added line #L127 was not covered by tests

public static ClickHouseInt128 MaxMagnitudeNumber(ClickHouseInt128 x, ClickHouseInt128 y) => throw new NotImplementedException();

Check warning on line 129 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L129

Added line #L129 was not covered by tests

public static ClickHouseInt128 MinMagnitude(ClickHouseInt128 x, ClickHouseInt128 y) => throw new NotImplementedException();

Check warning on line 131 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L131

Added line #L131 was not covered by tests

public static ClickHouseInt128 MinMagnitudeNumber(ClickHouseInt128 x, ClickHouseInt128 y) => throw new NotImplementedException();

Check warning on line 133 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L133

Added line #L133 was not covered by tests

public static ClickHouseInt128 Parse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider) => throw new NotImplementedException();

Check warning on line 135 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L135

Added line #L135 was not covered by tests

public static ClickHouseInt128 Parse(string s, NumberStyles style, IFormatProvider provider) => throw new NotImplementedException();

Check warning on line 137 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L137

Added line #L137 was not covered by tests

public static ClickHouseInt128 Parse(ReadOnlySpan<char> s, IFormatProvider provider) => throw new NotImplementedException();

Check warning on line 139 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L139

Added line #L139 was not covered by tests

public static ClickHouseInt128 Parse(string s, IFormatProvider provider) => throw new NotImplementedException();

Check warning on line 141 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L141

Added line #L141 was not covered by tests

#if NET8_0_OR_GREATER
public static bool TryConvertFromChecked<TOther>(TOther value, out ClickHouseInt128 result)
where TOther : INumberBase<TOther>
=> throw new NotImplementedException();

Check warning on line 146 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L146

Added line #L146 was not covered by tests

public static bool TryConvertFromSaturating<TOther>(TOther value, out ClickHouseInt128 result)
where TOther : INumberBase<TOther>
=> throw new NotImplementedException();

Check warning on line 150 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L150

Added line #L150 was not covered by tests

public static bool TryConvertFromTruncating<TOther>(TOther value, out ClickHouseInt128 result)
where TOther : INumberBase<TOther>
=> throw new NotImplementedException();

Check warning on line 154 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L154

Added line #L154 was not covered by tests

public static bool TryConvertToChecked<TOther>(ClickHouseInt128 value, out TOther result)
where TOther : INumberBase<TOther>
=> throw new NotImplementedException();

Check warning on line 158 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L158

Added line #L158 was not covered by tests

public static bool TryConvertToSaturating<TOther>(ClickHouseInt128 value, out TOther result)
where TOther : INumberBase<TOther>
=> throw new NotImplementedException();

Check warning on line 162 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L162

Added line #L162 was not covered by tests

public static bool TryConvertToTruncating<TOther>(ClickHouseInt128 value, out TOther result)
where TOther : INumberBase<TOther>
=> throw new NotImplementedException();

Check warning on line 166 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L166

Added line #L166 was not covered by tests

#endif
public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out ClickHouseInt128 result) => throw new NotImplementedException();

Check warning on line 169 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L169

Added line #L169 was not covered by tests

public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out ClickHouseInt128 result) => throw new NotImplementedException();

Check warning on line 171 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L171

Added line #L171 was not covered by tests

public static bool TryParse(ReadOnlySpan<char> s, IFormatProvider provider, out ClickHouseInt128 result) => throw new NotImplementedException();

Check warning on line 173 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L173

Added line #L173 was not covered by tests

public static bool TryParse(string s, IFormatProvider provider, out ClickHouseInt128 result) => throw new NotImplementedException();

Check warning on line 175 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L175

Added line #L175 was not covered by tests

public string ToString(string format, IFormatProvider formatProvider) => throw new NotImplementedException();

Check warning on line 177 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L177

Added line #L177 was not covered by tests

public bool TryFormat(Span<char> destination, out int charsWritten, ReadOnlySpan<char> format, IFormatProvider provider) => throw new NotImplementedException();

Check warning on line 179 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L179

Added line #L179 was not covered by tests

public static ClickHouseInt128 operator +(ClickHouseInt128 value) => value;

Check warning on line 181 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L181

Added line #L181 was not covered by tests

public static ClickHouseInt128 operator +(ClickHouseInt128 left, ClickHouseInt128 right)
{
ulong lower = left.lower + right.lower;
// Carry 1 if sum overflows
ulong carry = (lower < left.lower) ? 1UL : 0UL;

ulong upper = left.upper + right.upper + carry;
return new ClickHouseInt128(upper, lower);
}

public static ClickHouseInt128 operator -(ClickHouseInt128 value) => Zero - value;

Check warning on line 193 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L193

Added line #L193 was not covered by tests

public static ClickHouseInt128 operator -(ClickHouseInt128 left, ClickHouseInt128 right)
{
ulong lower = left.lower - right.lower;

Check warning on line 197 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L197

Added line #L197 was not covered by tests
// Borrow 1 if subtraction underflows
ulong borrow = (lower > left.lower) ? 1UL : 0UL;

Check warning on line 199 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L199

Added line #L199 was not covered by tests

ulong upper = left.upper - right.upper - borrow;
return new ClickHouseInt128(upper, lower);

Check warning on line 202 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L201-L202

Added lines #L201 - L202 were not covered by tests
}

public static ClickHouseInt128 operator ++(ClickHouseInt128 value) => value + One;

public static ClickHouseInt128 operator --(ClickHouseInt128 value) => value - One;

Check warning on line 207 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L207

Added line #L207 was not covered by tests

public static ClickHouseInt128 operator *(ClickHouseInt128 left, ClickHouseInt128 right) => throw new NotImplementedException();

Check warning on line 209 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L209

Added line #L209 was not covered by tests

public static ClickHouseInt128 operator /(ClickHouseInt128 left, ClickHouseInt128 right) => throw new NotImplementedException();

Check warning on line 211 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L211

Added line #L211 was not covered by tests

public static bool operator ==(ClickHouseInt128 left, ClickHouseInt128 right) => left.CompareTo(right) == 0;

Check warning on line 213 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L213

Added line #L213 was not covered by tests

public static bool operator !=(ClickHouseInt128 left, ClickHouseInt128 right) => left.CompareTo(right) != 0;

Check warning on line 215 in ClickHouse.Client/Numerics/ClickHouseInt128.cs

View check run for this annotation

Codecov / codecov/patch

ClickHouse.Client/Numerics/ClickHouseInt128.cs#L215

Added line #L215 was not covered by tests

public static explicit operator BigInteger(ClickHouseInt128 value)
{
var int128bytes = new byte[16];
BitConverter.GetBytes(value.lower).CopyTo(int128bytes.AsSpan(0));
BitConverter.GetBytes(value.upper).CopyTo(int128bytes.AsSpan(8));
return new BigInteger(int128bytes);
}

public bool Equals(ClickHouseInt128 other) => CompareTo(other) == 0;

public int CompareTo(ClickHouseInt128 other)
{
var comparison1 = Upper.CompareTo(other.Upper);
if (comparison1 != 0)
return comparison1;
return Lower.CompareTo(other.Lower);
}

public override bool Equals(object obj) => obj is ClickHouseInt128 other && CompareTo(other) == 0;
}
Loading