Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
MetadataKey.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Text.RegularExpressions;
5 
6 namespace SiliconStudio.BuildEngine
7 {
8  /// <summary>
9  /// Represent a metadata key. This object is immutable.
10  /// </summary>
11  public struct MetadataKey : IEquatable<MetadataKey>
12  {
13  public enum DatabaseType
14  {
15  Char,
16  Byte,
17  Short,
18  UnsignedShort,
19  Int,
20  UnsignedInt,
21  Long,
22  UnsignedLong,
23  Float,
24  Double,
25  String
26  };
27 
28  public string Name { get; private set; }
29 
30  public DatabaseType Type { get; private set; }
31 
32  public MetadataKey(string key, DatabaseType type)
33  : this()
34  {
35  if (key == null) throw new ArgumentNullException("key");
36  Name = key;
37  Type = type;
38  }
39 
40  public bool IsValid()
41  {
42  return Name != null && Name.Length < 256 && Regex.IsMatch(Name, "\\w");
43  }
44 
45  public static bool operator ==(MetadataKey left, MetadataKey right)
46  {
47  return left.Equals(right);
48  }
49 
50  public static bool operator !=(MetadataKey left, MetadataKey right)
51  {
52  return (!left.Equals(right));
53  }
54 
55  public override bool Equals(object obj)
56  {
57  if (ReferenceEquals(null, obj))
58  return false;
59 
60  return obj.GetType() == GetType() && Equals((MetadataKey)obj);
61  }
62 
63  public bool Equals(MetadataKey other)
64  {
65  return other.Name == Name && other.Type == Type;
66  }
67 
68  public override int GetHashCode()
69  {
70  unchecked
71  {
72  return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Type.GetHashCode();
73  }
74  }
75 
76  public override string ToString()
77  {
78  return (Name ?? "{null}") + " (" + Type + ")";
79  }
80 
81  public object ConvertValue(string databaseValue)
82  {
83  switch (Type)
84  {
85  case DatabaseType.Char:
86  return databaseValue[0];
87  case DatabaseType.Byte:
88  return byte.Parse(databaseValue);
89  case DatabaseType.Short:
90  return short.Parse(databaseValue);
91  case DatabaseType.UnsignedShort:
92  return ushort.Parse(databaseValue);
93  case DatabaseType.Int:
94  return int.Parse(databaseValue);
95  case DatabaseType.UnsignedInt:
96  return uint.Parse(databaseValue);
97  case DatabaseType.Long:
98  return long.Parse(databaseValue);
99  case DatabaseType.UnsignedLong:
100  return ulong.Parse(databaseValue);
101  case DatabaseType.Float:
102  return float.Parse(databaseValue);
103  case DatabaseType.Double:
104  return double.Parse(databaseValue);
105  case DatabaseType.String:
106  return databaseValue;
107  default:
108  throw new InvalidOperationException("Type is unknown or its conversion has not been implemented.");
109  }
110  }
111 
112  public Type GetKeyType()
113  {
114  switch (Type)
115  {
116  case DatabaseType.Char:
117  return typeof(char);
118  case DatabaseType.Byte:
119  return typeof(byte);
120  case DatabaseType.Short:
121  return typeof(short);
122  case DatabaseType.UnsignedShort:
123  return typeof(ushort);
124  case DatabaseType.Int:
125  return typeof(int);
126  case DatabaseType.UnsignedInt:
127  return typeof(uint);
128  case DatabaseType.Long:
129  return typeof(long);
130  case DatabaseType.UnsignedLong:
131  return typeof(ulong);
132  case DatabaseType.Float:
133  return typeof(float);
134  case DatabaseType.Double:
135  return typeof(double);
136  case DatabaseType.String:
137  return typeof(string);
138  default:
139  throw new InvalidOperationException("Type is unknown.");
140  }
141  }
142 
143  public object GetDefaultValue()
144  {
145  return Type == DatabaseType.String ? "" : Activator.CreateInstance(GetKeyType());
146  }
147  }
148 }
object ConvertValue(string databaseValue)
Definition: MetadataKey.cs:81
Represent a metadata key. This object is immutable.
Definition: MetadataKey.cs:11
bool Equals(MetadataKey other)
Definition: MetadataKey.cs:63
override bool Equals(object obj)
Definition: MetadataKey.cs:55
MetadataKey(string key, DatabaseType type)
Definition: MetadataKey.cs:32