sources/Google.Solutions.Common/Util/EnumExtensions.cs (42 lines of code) (raw):
//
// Copyright 2020 Google LLC
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
using System;
using System.Linq;
using System.Reflection;
namespace Google.Solutions.Common.Util
{
/// <summary>
/// Utility methods for working with enum flags.
/// </summary>
public static class EnumExtensions
{
private static bool IsPowerOfTwo(int v)
{
return v != 0 && (v & (v - 1)) == 0;
}
/// <summary>
/// Check if the value has only a single flag set.
/// </summary>
public static bool IsSingleFlag<TEnum>(this TEnum enumValue)
where TEnum : struct
{
return IsPowerOfTwo((int)(object)enumValue);
}
/// <summary>
/// Check if the value has more than one flag set.
/// </summary>
public static bool IsFlagCombination<TEnum>(this TEnum enumValue)
where TEnum : struct
{
var v = (int)(object)enumValue;
return v != 0 && !IsPowerOfTwo(v);
}
/// <summary>
/// Check all flags set represent valid enum values.
/// </summary>
public static bool IsValidFlagCombination<TEnum>(this TEnum enumValue)
{
var numericValue = Convert.ToInt64(enumValue);
//
// Create a bit field with all flags on.
//
var max = Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
.Select(v => Convert.ToInt64(v))
.Aggregate((e1, e2) => e1 | e2);
return (max & numericValue) == numericValue;
}
public static TAttribute? GetAttribute<TAttribute>(this Enum enumValue)
where TAttribute : Attribute
{
return enumValue
.GetType()
.GetMember(enumValue.ToString())
.FirstOrDefault()?
.GetCustomAttribute<TAttribute>();
}
}
}