using System; using System.Collections.Generic; namespace CppSharp.AST { /// /// Represents a C/C++ enumeration declaration. /// public class Enumeration : DeclarationContext { [Flags] public enum EnumModifiers { Anonymous = 1 << 0, Scoped = 1 << 1, Flags = 1 << 2, } /// /// Represents a C/C++ enumeration item. /// public class Item : Declaration { public ulong Value; public string Expression; public bool ExplicitValue = true; public bool IsHexadecimal { get { if (Expression == null) { return false; } return Expression.Contains("0x") || Expression.Contains("0X"); } } public override T Visit(IDeclVisitor visitor) { throw new NotImplementedException(); } } public Enumeration() { Items = new List(); ItemsByName = new Dictionary(); BuiltinType = new BuiltinType(PrimitiveType.Int); } public Enumeration AddItem(Item item) { Items.Add(item); ItemsByName[item.Name] = item; return this; } public string GetItemValueAsString(Item item) { var printAsHex = item.IsHexadecimal && BuiltinType.IsUnsigned; var format = printAsHex ? "x" : string.Empty; var value = BuiltinType.IsUnsigned ? item.Value.ToString(format) : ((long)item.Value).ToString(format); return printAsHex ? "0x" + value : value; } public Enumeration SetFlags() { Modifiers |= EnumModifiers.Flags; return this; } public bool IsFlags { get { return Modifiers.HasFlag(EnumModifiers.Flags); } } public Type Type { get; set; } public BuiltinType BuiltinType { get; set; } public EnumModifiers Modifiers { get; set; } public List Items; public Dictionary ItemsByName; public override T Visit(IDeclVisitor visitor) { return visitor.VisitEnumDecl(this); } } }