/* Copyright 2010-2014 MongoDB Inc. * * Licensed 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; namespace MongoDB.Bson { // TODO: [Serializable] // must have custom deserialization to do SymbolTable lookup /// /// Represents a BSON symbol value. /// public class BsonSymbol : BsonValue, IComparable, IEquatable { // private fields private readonly string _name; // constructors // internal because only BsonSymbolTable should call this constructor internal BsonSymbol(string name) { if (name == null) { throw new ArgumentNullException("name"); } _name = name; } // public properties /// /// Gets the BsonType of this BsonValue. /// public override BsonType BsonType { get { return BsonType.Symbol; } } /// /// Gets the name of the symbol. /// public string Name { get { return _name; } } // public operators /// /// Converts a string to a BsonSymbol. /// /// A string. /// A BsonSymbol. public static implicit operator BsonSymbol(string name) { return BsonSymbolTable.Lookup(name); } /// /// Compares two BsonSymbol values. /// /// The first BsonSymbol. /// The other BsonSymbol. /// True if the two BsonSymbol values are not equal according to ==. public static bool operator !=(BsonSymbol lhs, BsonSymbol rhs) { return !(lhs == rhs); } /// /// Compares two BsonSymbol values. /// /// The first BsonSymbol. /// The other BsonSymbol. /// True if the two BsonSymbol values are equal according to ==. public static bool operator ==(BsonSymbol lhs, BsonSymbol rhs) { if (object.ReferenceEquals(lhs, null)) { return object.ReferenceEquals(rhs, null); } return lhs.Equals(rhs); } // public static methods /// /// Creates a new BsonSymbol. /// /// An object to be mapped to a BsonSymbol. /// A BsonSymbol or null. public new static BsonSymbol Create(object value) { if (value == null) { throw new ArgumentNullException("value"); } return (BsonSymbol)BsonTypeMapper.MapToBsonValue(value, BsonType.Symbol); } // public methods // note: a BsonSymbol is guaranteed to be unique because it must be looked up in BsonSymbolTable // therefore the implementations of Equals and GetHashCode are considerably more efficient /// /// Compares this BsonSymbol to another BsonSymbol. /// /// The other BsonSymbol. /// A 32-bit signed integer that indicates whether this BsonSymbol is less than, equal to, or greather than the other. public int CompareTo(BsonSymbol other) { if (other == null) { return 1; } return _name.CompareTo(other._name); } /// /// Compares the BsonSymbol to another BsonValue. /// /// The other BsonValue. /// A 32-bit signed integer that indicates whether this BsonSymbol is less than, equal to, or greather than the other BsonValue. public override int CompareTo(BsonValue other) { if (other == null) { return 1; } var otherSymbol = other as BsonSymbol; if (otherSymbol != null) { return _name.CompareTo(otherSymbol.Name); } var otherString = other as BsonString; if (otherString != null) { return _name.CompareTo(otherString.Value); } return CompareTypeTo(other); } /// /// Compares this BsonSymbol to another BsonSymbol. /// /// The other BsonSymbol. /// True if the two BsonSymbol values are equal. public bool Equals(BsonSymbol rhs) { if (object.ReferenceEquals(rhs, null) || GetType() != rhs.GetType()) { return false; } return object.ReferenceEquals(this, rhs); // symbols are guaranteed to be unique } /// /// Compares this BsonSymbol to another object. /// /// The other object. /// True if the other object is a BsonSymbol and equal to this one. public override bool Equals(object obj) { return Equals(obj as BsonSymbol); // works even if obj is null or of a different type } /// /// Gets the hash code. /// /// The hash code. public override int GetHashCode() { return _name.GetHashCode(); } /// /// Returns a string representation of the value. /// /// A string representation of the value. public override string ToString() { return _name; } } }