| // Copyright 2018 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | part of google_maps_flutter; | 
 |  | 
 | /// A pair of latitude and longitude coordinates, stored as degrees. | 
 | class LatLng { | 
 |   /// Creates a geographical location specified in degrees [latitude] and | 
 |   /// [longitude]. | 
 |   /// | 
 |   /// The latitude is clamped to the inclusive interval from -90.0 to +90.0. | 
 |   /// | 
 |   /// The longitude is normalized to the half-open interval from -180.0 | 
 |   /// (inclusive) to +180.0 (exclusive) | 
 |   const LatLng(double latitude, double longitude) | 
 |       : assert(latitude != null), | 
 |         assert(longitude != null), | 
 |         latitude = | 
 |             (latitude < -90.0 ? -90.0 : (90.0 < latitude ? 90.0 : latitude)), | 
 |         longitude = (longitude + 180.0) % 360.0 - 180.0; | 
 |  | 
 |   /// The latitude in degrees between -90.0 and 90.0, both inclusive. | 
 |   final double latitude; | 
 |  | 
 |   /// The longitude in degrees between -180.0 (inclusive) and 180.0 (exclusive). | 
 |   final double longitude; | 
 |  | 
 |   dynamic _toJson() { | 
 |     return <double>[latitude, longitude]; | 
 |   } | 
 |  | 
 |   static LatLng _fromJson(dynamic json) { | 
 |     if (json == null) { | 
 |       return null; | 
 |     } | 
 |     return LatLng(json[0], json[1]); | 
 |   } | 
 |  | 
 |   @override | 
 |   String toString() => '$runtimeType($latitude, $longitude)'; | 
 |  | 
 |   @override | 
 |   bool operator ==(Object o) { | 
 |     return o is LatLng && o.latitude == latitude && o.longitude == longitude; | 
 |   } | 
 |  | 
 |   @override | 
 |   int get hashCode => hashValues(latitude, longitude); | 
 | } | 
 |  | 
 | /// A latitude/longitude aligned rectangle. | 
 | /// | 
 | /// The rectangle conceptually includes all points (lat, lng) where | 
 | /// * lat ∈ [`southwest.latitude`, `northeast.latitude`] | 
 | /// * lng ∈ [`southwest.longitude`, `northeast.longitude`], | 
 | ///   if `southwest.longitude` ≤ `northeast.longitude`, | 
 | /// * lng ∈ [-180, `northeast.longitude`] ∪ [`southwest.longitude`, 180[, | 
 | ///   if `northeast.longitude` < `southwest.longitude` | 
 | class LatLngBounds { | 
 |   /// Creates geographical bounding box with the specified corners. | 
 |   /// | 
 |   /// The latitude of the southwest corner cannot be larger than the | 
 |   /// latitude of the northeast corner. | 
 |   LatLngBounds({@required this.southwest, @required this.northeast}) | 
 |       : assert(southwest != null), | 
 |         assert(northeast != null), | 
 |         assert(southwest.latitude <= northeast.latitude); | 
 |  | 
 |   /// The southwest corner of the rectangle. | 
 |   final LatLng southwest; | 
 |  | 
 |   /// The northeast corner of the rectangle. | 
 |   final LatLng northeast; | 
 |  | 
 |   dynamic _toList() { | 
 |     return <dynamic>[southwest._toJson(), northeast._toJson()]; | 
 |   } | 
 |  | 
 |   /// Returns whether this rectangle contains the given [LatLng]. | 
 |   bool contains(LatLng point) { | 
 |     return _containsLatitude(point.latitude) && | 
 |         _containsLongitude(point.longitude); | 
 |   } | 
 |  | 
 |   bool _containsLatitude(double lat) { | 
 |     return (southwest.latitude <= lat) && (lat <= northeast.latitude); | 
 |   } | 
 |  | 
 |   bool _containsLongitude(double lng) { | 
 |     if (southwest.longitude <= northeast.longitude) { | 
 |       return southwest.longitude <= lng && lng <= northeast.longitude; | 
 |     } else { | 
 |       return southwest.longitude <= lng || lng <= northeast.longitude; | 
 |     } | 
 |   } | 
 |  | 
 |   @visibleForTesting | 
 |   static LatLngBounds fromList(dynamic json) { | 
 |     if (json == null) { | 
 |       return null; | 
 |     } | 
 |     return LatLngBounds( | 
 |       southwest: LatLng._fromJson(json[0]), | 
 |       northeast: LatLng._fromJson(json[1]), | 
 |     ); | 
 |   } | 
 |  | 
 |   @override | 
 |   String toString() { | 
 |     return '$runtimeType($southwest, $northeast)'; | 
 |   } | 
 |  | 
 |   @override | 
 |   bool operator ==(Object o) { | 
 |     return o is LatLngBounds && | 
 |         o.southwest == southwest && | 
 |         o.northeast == northeast; | 
 |   } | 
 |  | 
 |   @override | 
 |   int get hashCode => hashValues(southwest, northeast); | 
 | } |