#region PDFsharp - A .NET library for processing PDF // // Authors: // Stefan Lange // // Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany) // // http://www.pdfsharp.com // http://sourceforge.net/projects/pdfsharp // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. #endregion using System; using System.Diagnostics; using System.Globalization; namespace PdfSharp.Pdf { /// /// Represents a PDF object identifier, a pair of object and generation number. /// [DebuggerDisplay("{DebuggerDisplay}")] public struct PdfObjectID : IComparable { /// /// Initializes a new instance of the class. /// /// The object number. public PdfObjectID(int objectNumber) { Debug.Assert(objectNumber >= 1, "Object number out of range."); _objectNumber = objectNumber; _generationNumber = 0; #if DEBUG_ // Just a place for a breakpoint during debugging. if (objectNumber == 5894) GetType(); #endif } /// /// Initializes a new instance of the class. /// /// The object number. /// The generation number. public PdfObjectID(int objectNumber, int generationNumber) { Debug.Assert(objectNumber >= 1, "Object number out of range."); //Debug.Assert(generationNumber >= 0 && generationNumber <= 65535, "Generation number out of range."); #if DEBUG_ // iText creates generation numbers with a value of 65536... if (generationNumber > 65535) Debug.WriteLine(String.Format("Generation number: {0}", generationNumber)); #endif _objectNumber = objectNumber; _generationNumber = (ushort)generationNumber; } /// /// Gets or sets the object number. /// public int ObjectNumber { get { return _objectNumber; } } readonly int _objectNumber; /// /// Gets or sets the generation number. /// public int GenerationNumber { get { return _generationNumber; } } readonly ushort _generationNumber; /// /// Indicates whether this object is an empty object identifier. /// public bool IsEmpty { get { return _objectNumber == 0; } } /// /// Indicates whether this instance and a specified object are equal. /// public override bool Equals(object obj) { if (obj is PdfObjectID) { PdfObjectID id = (PdfObjectID)obj; if (_objectNumber == id._objectNumber) return _generationNumber == id._generationNumber; } return false; } /// /// Returns the hash code for this instance. /// public override int GetHashCode() { return _objectNumber ^ _generationNumber; } /// /// Determines whether the two objects are equal. /// public static bool operator ==(PdfObjectID left, PdfObjectID right) { return left.Equals(right); } /// /// Determines whether the tow objects not are equal. /// public static bool operator !=(PdfObjectID left, PdfObjectID right) { return !left.Equals(right); } /// /// Returns the object and generation numbers as a string. /// public override string ToString() { return _objectNumber.ToString(CultureInfo.InvariantCulture) + " " + _generationNumber.ToString(CultureInfo.InvariantCulture); } /// /// Creates an empty object identifier. /// public static PdfObjectID Empty { get { return new PdfObjectID(); } } /// /// Compares the current object id with another object. /// public int CompareTo(object obj) { if (obj is PdfObjectID) { PdfObjectID id = (PdfObjectID)obj; if (_objectNumber == id._objectNumber) return _generationNumber - id._generationNumber; return _objectNumber - id._objectNumber; } return 1; } /// /// Gets the DebuggerDisplayAttribute text. /// internal string DebuggerDisplay { get { return String.Format("id=({0})", ToString()); } } } }