Welcome to mirror list, hosted at ThFree Co, Russian Federation.

MathExtensions.cs « Extensions « UVtools.Core - github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4bb6c9231ccb62a255508cf517a3662550ff8503 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
 *                     GNU AFFERO GENERAL PUBLIC LICENSE
 *                       Version 3, 19 November 2007
 *  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 *  Everyone is permitted to copy and distribute verbatim copies
 *  of this license document, but changing it is not allowed.
 */

using System;
using System.Globalization;

namespace UVtools.Core.Extensions
{
    public static class MathExtensions
    {
        public static byte Clamp(this byte value, byte min, byte max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static sbyte Clamp(this sbyte value, sbyte min, sbyte max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static ushort Clamp(this ushort value, ushort min, ushort max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static short Clamp(this short value, short min, short max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static uint Clamp(this uint value, uint min, uint max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static int Clamp(this int value, int min, int max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static ulong Clamp(this ulong value, ulong min, ulong max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static long Clamp(this long value, long min, long max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static float Clamp(this float value, float min, float max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static double Clamp(this double value, double min, double max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static decimal Clamp(this decimal value, decimal min, decimal max)
        {
            return value <= min ? min : value >= max ? max : value;
        }

        public static T Clamp<T>(T value, T min, T max) where T : IComparable<T>
        {
            if (value.CompareTo(min) < 0)
                return min;
            if (value.CompareTo(max) > 0)
                return max;

            return value;
        }

        public static uint DecimalDigits(this float val)
        {
            var valStr = val.ToString(CultureInfo.InvariantCulture).TrimEnd('0');
            if (string.IsNullOrEmpty(valStr)) return 0;

            var index = valStr.IndexOf('.');
            if (index < 0) return 0;

            return (uint) (valStr.Substring(index).Length - 1);
        }

        public static uint DecimalDigits(this double val)
        {
            var valStr = val.ToString(CultureInfo.InvariantCulture).TrimEnd('0');
            if (string.IsNullOrEmpty(valStr)) return 0;

            var index = valStr.IndexOf('.');
            if (index < 0) return 0;

            return (uint)(valStr.Substring(index).Length - 1);
        }

        public static uint DecimalDigits(this decimal val)
        {
            var valStr = val.ToString(CultureInfo.InvariantCulture).TrimEnd('0');
            if (string.IsNullOrEmpty(valStr) || valStr[^1] == '.') return 0;

            var index = valStr.IndexOf('.');
            if (index < 0) return 0;

            return (uint)(valStr.Substring(index).Length - 1);
        }

        public static bool IsInteger(this float val, float tolerance = 0.0001f) => Math.Abs(val - Math.Floor(val)) < tolerance;
        public static bool IsInteger(this double val, double tolerance = 0.0001) => Math.Abs(val - Math.Floor(val)) < tolerance;
        public static bool IsInteger(this decimal val) => val == Math.Floor(val);
    }
}