Skip to content

Commit ec9c338

Browse files
authored
Merge pull request #1 from SixLabors/feature/add-guards
Added guards from the ImageSharp project
2 parents 46c3cba + 9d79164 commit ec9c338

File tree

4 files changed

+459
-0
lines changed

4 files changed

+459
-0
lines changed
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
// Copyright (c) Six Labors and contributors.
2+
// Licensed under the Apache License, Version 2.0.
3+
4+
using System;
5+
using System.Diagnostics;
6+
7+
namespace SixLabors
8+
{
9+
/// <summary>
10+
/// Provides methods to protect against invalid parameters for a DEBUG build.
11+
/// </summary>
12+
[DebuggerStepThrough]
13+
internal static class DebugGuard
14+
{
15+
/// <summary>
16+
/// Verifies, that the method parameter with specified object value is not null
17+
/// and throws an exception if it is found to be so.
18+
/// </summary>
19+
/// <param name="target">The target object, which cannot be null.</param>
20+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
21+
/// <exception cref="ArgumentNullException"><paramref name="target"/> is null</exception>
22+
[Conditional("DEBUG")]
23+
public static void NotNull(object target, string parameterName)
24+
{
25+
if (target == null)
26+
{
27+
throw new ArgumentNullException(parameterName);
28+
}
29+
}
30+
31+
/// <summary>
32+
/// Verifies that the specified value is less than a maximum value
33+
/// and throws an exception if it is not.
34+
/// </summary>
35+
/// <param name="value">The target value, which should be validated.</param>
36+
/// <param name="max">The maximum value.</param>
37+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
38+
/// <typeparam name="TValue">The type of the value.</typeparam>
39+
/// <exception cref="ArgumentException">
40+
/// <paramref name="value"/> is greater than the maximum value.
41+
/// </exception>
42+
[Conditional("DEBUG")]
43+
public static void MustBeLessThan<TValue>(TValue value, TValue max, string parameterName)
44+
where TValue : IComparable<TValue>
45+
{
46+
if (value.CompareTo(max) >= 0)
47+
{
48+
throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}.");
49+
}
50+
}
51+
52+
/// <summary>
53+
/// Verifies that the specified value is less than or equal to a maximum value
54+
/// and throws an exception if it is not.
55+
/// </summary>
56+
/// <param name="value">The target value, which should be validated.</param>
57+
/// <param name="max">The maximum value.</param>
58+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
59+
/// <typeparam name="TValue">The type of the value.</typeparam>
60+
/// <exception cref="ArgumentException">
61+
/// <paramref name="value"/> is greater than the maximum value.
62+
/// </exception>
63+
[Conditional("DEBUG")]
64+
public static void MustBeLessThanOrEqualTo<TValue>(TValue value, TValue max, string parameterName)
65+
where TValue : IComparable<TValue>
66+
{
67+
if (value.CompareTo(max) > 0)
68+
{
69+
throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}.");
70+
}
71+
}
72+
73+
/// <summary>
74+
/// Verifies that the specified value is greater than a minimum value
75+
/// and throws an exception if it is not.
76+
/// </summary>
77+
/// <param name="value">The target value, which should be validated.</param>
78+
/// <param name="min">The minimum value.</param>
79+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
80+
/// <typeparam name="TValue">The type of the value.</typeparam>
81+
/// <exception cref="ArgumentException">
82+
/// <paramref name="value"/> is less than the minimum value.
83+
/// </exception>
84+
[Conditional("DEBUG")]
85+
public static void MustBeGreaterThan<TValue>(TValue value, TValue min, string parameterName)
86+
where TValue : IComparable<TValue>
87+
{
88+
if (value.CompareTo(min) <= 0)
89+
{
90+
throw new ArgumentOutOfRangeException(
91+
parameterName,
92+
$"Value must be greater than {min}.");
93+
}
94+
}
95+
96+
/// <summary>
97+
/// Verifies that the specified value is greater than or equal to a minimum value
98+
/// and throws an exception if it is not.
99+
/// </summary>
100+
/// <param name="value">The target value, which should be validated.</param>
101+
/// <param name="min">The minimum value.</param>
102+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
103+
/// <typeparam name="TValue">The type of the value.</typeparam>
104+
/// <exception cref="ArgumentException">
105+
/// <paramref name="value"/> is less than the minimum value.
106+
/// </exception>
107+
[Conditional("DEBUG")]
108+
public static void MustBeGreaterThanOrEqualTo<TValue>(TValue value, TValue min, string parameterName)
109+
where TValue : IComparable<TValue>
110+
{
111+
if (value.CompareTo(min) < 0)
112+
{
113+
throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}.");
114+
}
115+
}
116+
117+
/// <summary>
118+
/// Verifies, that the method parameter with specified target value is true
119+
/// and throws an exception if it is found to be so.
120+
/// </summary>
121+
/// <param name="target">
122+
/// The target value, which cannot be false.
123+
/// </param>
124+
/// <param name="parameterName">
125+
/// The name of the parameter that is to be checked.
126+
/// </param>
127+
/// <param name="message">
128+
/// The error message, if any to add to the exception.
129+
/// </param>
130+
/// <exception cref="ArgumentException">
131+
/// <paramref name="target"/> is false
132+
/// </exception>
133+
[Conditional("DEBUG")]
134+
public static void IsTrue(bool target, string parameterName, string message)
135+
{
136+
if (!target)
137+
{
138+
throw new ArgumentException(message, parameterName);
139+
}
140+
}
141+
142+
/// <summary>
143+
/// Verifies, that the method parameter with specified target value is false
144+
/// and throws an exception if it is found to be so.
145+
/// </summary>
146+
/// <param name="target">The target value, which cannot be true.</param>
147+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
148+
/// <param name="message">The error message, if any to add to the exception.</param>
149+
/// <exception cref="ArgumentException">
150+
/// <paramref name="target"/> is true
151+
/// </exception>
152+
[Conditional("DEBUG")]
153+
public static void IsFalse(bool target, string parameterName, string message)
154+
{
155+
if (target)
156+
{
157+
throw new ArgumentException(message, parameterName);
158+
}
159+
}
160+
161+
/// <summary>
162+
/// Verifies, that the target span is of same size than the 'other' span.
163+
/// </summary>
164+
/// <typeparam name="T">The element type of the spans</typeparam>
165+
/// <param name="target">The target span.</param>
166+
/// <param name="other">The 'other' span to compare 'target' to.</param>
167+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
168+
/// <exception cref="ArgumentException">
169+
/// <paramref name="target"/> is true
170+
/// </exception>
171+
[Conditional("DEBUG")]
172+
public static void MustBeSameSized<T>(ReadOnlySpan<T> target, ReadOnlySpan<T> other, string parameterName)
173+
where T : struct
174+
{
175+
if (target.Length != other.Length)
176+
{
177+
throw new ArgumentException("Span-s must be the same size!", parameterName);
178+
}
179+
}
180+
181+
/// <summary>
182+
/// Verifies, that the `target` span has the length of 'minSpan', or longer.
183+
/// </summary>
184+
/// <typeparam name="T">The element type of the spans</typeparam>
185+
/// <param name="target">The target span.</param>
186+
/// <param name="minSpan">The 'minSpan' span to compare 'target' to.</param>
187+
/// <param name="parameterName">The name of the parameter that is to be checked.</param>
188+
/// <exception cref="ArgumentException">
189+
/// <paramref name="target"/> is true
190+
/// </exception>
191+
[Conditional("DEBUG")]
192+
public static void MustBeSizedAtLeast<T>(ReadOnlySpan<T> target, ReadOnlySpan<T> minSpan, string parameterName)
193+
where T : struct
194+
{
195+
if (target.Length < minSpan.Length)
196+
{
197+
throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName);
198+
}
199+
}
200+
}
201+
}

0 commit comments

Comments
 (0)