--- /dev/null
+/*\r
+ * Yubeshi GPS Parser\r
+ *\r
+ * This software is distributed under a zlib-style license.\r
+ * See license.txt for more information.\r
+ */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+\r
+namespace Yubeshi\r
+{\r
+ /// <summary>\r
+ /// Height(or Altitude) in metre\r
+ /// </summary>\r
+ public struct Height\r
+ {\r
+ #region type definitions\r
+ public enum Base : int\r
+ {\r
+ Unknown = 0,\r
+ EarthCenter = 1,\r
+ MeanSeaLevel = 2,\r
+ Geoid = 3,\r
+ Ellipsoid = 0x100,\r
+ BesselEllipsoid = Ellipsoid | 41,\r
+ Grs80Ellipsoid = Ellipsoid | 80,\r
+ Wgs84Ellipsoid = Ellipsoid | 84,\r
+ }\r
+ #endregion\r
+\r
+ #region fields\r
+ private double height;\r
+ private Base baseLevel;\r
+ #endregion\r
+\r
+ #region constructors\r
+ public Height(double height)\r
+ :this(height, Base.Unknown)\r
+ {\r
+ }\r
+\r
+ public Height(double height, Base baseLevel)\r
+ {\r
+ \r
+ this.height = height;\r
+ this.baseLevel = baseLevel;\r
+ }\r
+ #endregion\r
+\r
+ #region operators\r
+ public static implicit operator Height(double height)\r
+ {\r
+ return new Height(height);\r
+ }\r
+\r
+ public static implicit operator double(Height height)\r
+ {\r
+ return height.height;\r
+ }\r
+ \r
+ public static Height operator +(Height left, double right)\r
+ {\r
+ return new Height(left.height + right, left.baseLevel);\r
+ }\r
+\r
+ public static Height operator +(double left, Height right)\r
+ {\r
+ return new Height(right.height + left, right.baseLevel);\r
+ }\r
+\r
+ public static double operator -(Height left, Height right)\r
+ {\r
+ if (left.baseLevel != right.baseLevel)\r
+ {\r
+ if (left.baseLevel != Base.Unknown &&\r
+ right.baseLevel != Base.Unknown)\r
+ {\r
+ throw new InvalidOperationException(\r
+ "mismatched base level");\r
+ }\r
+ }\r
+ return left.height - right.height;\r
+ }\r
+ #endregion\r
+\r
+ #region properties\r
+\r
+ public Base BaseLevel\r
+ {\r
+ get\r
+ {\r
+ return baseLevel;\r
+ }\r
+ }\r
+\r
+ public bool IsAltitude\r
+ {\r
+ get\r
+ {\r
+ return (baseLevel == Base.MeanSeaLevel) ||\r
+ (baseLevel == Base.Geoid);\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ #region public methods\r
+ #endregion\r
+ }\r
+}\r