Hardware/Identifier.cs
author moel.mich
Sun, 08 May 2011 22:10:13 +0000
changeset 279 6bce967ba1b5
parent 184 3ad822f418cb
child 344 3145aadca3d2
permissions -rw-r--r--
Fixed the bus and core clock reading on AMD family 10h model Ah CPUs. The new "Core Performance Boost" feature of these CPUs resulted in very low accuracy of the bus speed (and as a consequence also an inaccurate TSC multiplier). This fixed Issue 205.
moel@109
     1
/*
moel@109
     2
  
moel@109
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@109
     4
moel@109
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@109
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@109
     7
  the License. You may obtain a copy of the License at
moel@109
     8
 
moel@109
     9
  http://www.mozilla.org/MPL/
moel@109
    10
moel@109
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@109
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@109
    13
  for the specific language governing rights and limitations under the License.
moel@109
    14
moel@109
    15
  The Original Code is the Open Hardware Monitor code.
moel@109
    16
moel@109
    17
  The Initial Developer of the Original Code is 
moel@109
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@109
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@109
    20
  the Initial Developer. All Rights Reserved.
moel@109
    21
moel@109
    22
  Contributor(s):
moel@109
    23
moel@109
    24
  Alternatively, the contents of this file may be used under the terms of
moel@109
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@109
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@109
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@109
    28
  of those above. If you wish to allow use of your version of this file only
moel@109
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@109
    30
  use your version of this file under the terms of the MPL, indicate your
moel@109
    31
  decision by deleting the provisions above and replace them with the notice
moel@109
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@109
    33
  the provisions above, a recipient may use your version of this file under
moel@109
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@109
    35
 
moel@109
    36
*/
moel@109
    37
moel@109
    38
using System;
moel@195
    39
using System.Collections.Generic;
moel@109
    40
using System.Text;
moel@109
    41
moel@109
    42
namespace OpenHardwareMonitor.Hardware {
moel@176
    43
  public class Identifier : IComparable<Identifier> {
moel@195
    44
    private readonly string identifier;
moel@109
    45
moel@195
    46
    private const char Separator = '/';
moel@109
    47
moel@195
    48
    private static void CheckIdentifiers(IEnumerable<string> identifiers) {      
moel@109
    49
      foreach (string s in identifiers)
moel@195
    50
        if (s.Contains(" ") || s.Contains(Separator.ToString()))
moel@109
    51
          throw new ArgumentException("Invalid identifier");
moel@109
    52
    }
moel@109
    53
moel@109
    54
    public Identifier(params string[] identifiers) {
moel@109
    55
      CheckIdentifiers(identifiers);
moel@109
    56
moel@109
    57
      StringBuilder s = new StringBuilder();
moel@109
    58
      for (int i = 0; i < identifiers.Length; i++) {
moel@195
    59
        s.Append(Separator);
moel@109
    60
        s.Append(identifiers[i]);
moel@109
    61
      }
moel@109
    62
      this.identifier = s.ToString();
moel@109
    63
    }
moel@109
    64
moel@109
    65
    public Identifier(Identifier identifier, params string[] extensions) {
moel@109
    66
      CheckIdentifiers(extensions);
moel@109
    67
moel@109
    68
      StringBuilder s = new StringBuilder();
moel@109
    69
      s.Append(identifier.ToString());
moel@109
    70
      for (int i = 0; i < extensions.Length; i++) {
moel@195
    71
        s.Append(Separator);
moel@109
    72
        s.Append(extensions[i]);
moel@109
    73
      }
moel@109
    74
      this.identifier = s.ToString();
moel@109
    75
    }
moel@109
    76
moel@109
    77
    public override string ToString() {
moel@109
    78
      return identifier;
moel@109
    79
    }
moel@109
    80
moel@195
    81
    public override bool Equals(Object obj) {
moel@109
    82
      if (obj == null)
moel@109
    83
        return false;
moel@109
    84
moel@109
    85
      Identifier id = obj as Identifier;
moel@109
    86
      if (id == null)
moel@109
    87
        return false;
moel@109
    88
moel@109
    89
      return (identifier == id.identifier);
moel@109
    90
    }
moel@109
    91
moel@109
    92
    public override int GetHashCode() {
moel@109
    93
      return identifier.GetHashCode();
moel@109
    94
    }
moel@176
    95
moel@176
    96
    public int CompareTo(Identifier other) {
moel@176
    97
      if (other == null)
moel@176
    98
        return 1;
moel@176
    99
      else 
moel@182
   100
        return string.Compare(this.identifier, other.identifier, 
moel@182
   101
          StringComparison.Ordinal);
moel@176
   102
    }
moel@182
   103
moel@182
   104
    public static bool operator ==(Identifier id1, Identifier id2) {
moel@184
   105
      if (id1.Equals(null))
moel@184
   106
        return id2.Equals(null);
moel@182
   107
      else
moel@182
   108
        return id1.Equals(id2);
moel@182
   109
    }
moel@182
   110
moel@182
   111
    public static bool operator !=(Identifier id1, Identifier id2) {
moel@182
   112
      return !(id1 == id2);
moel@182
   113
    }
moel@182
   114
moel@182
   115
    public static bool operator <(Identifier id1, Identifier id2) {
moel@182
   116
      if (id1 == null)
moel@182
   117
        return id2 != null;
moel@182
   118
      else 
moel@182
   119
        return (id1.CompareTo(id2) < 0);
moel@182
   120
    }
moel@182
   121
moel@182
   122
    public static bool operator >(Identifier id1, Identifier id2) {
moel@182
   123
      if (id1 == null)
moel@182
   124
        return false;
moel@182
   125
      else 
moel@182
   126
        return (id1.CompareTo(id2) > 0);
moel@182
   127
    }  
moel@182
   128
moel@109
   129
  }
moel@109
   130
}