99 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
This file is part of Telegram Desktop,
 | 
						|
the official desktop application for the Telegram messaging service.
 | 
						|
 | 
						|
For license and copyright information please follow this link:
 | 
						|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
						|
*/
 | 
						|
#pragma once
 | 
						|
 | 
						|
namespace Data {
 | 
						|
 | 
						|
struct FileOrigin;
 | 
						|
 | 
						|
class LocationPoint {
 | 
						|
public:
 | 
						|
	LocationPoint() = default;
 | 
						|
	explicit LocationPoint(const MTPDgeoPoint &point)
 | 
						|
	: _lat(point.vlat().v)
 | 
						|
	, _lon(point.vlong().v)
 | 
						|
	, _access(point.vaccess_hash().v) {
 | 
						|
	}
 | 
						|
 | 
						|
	QString latAsString() const {
 | 
						|
		return AsString(_lat);
 | 
						|
	}
 | 
						|
	QString lonAsString() const {
 | 
						|
		return AsString(_lon);
 | 
						|
	}
 | 
						|
	MTPGeoPoint toMTP() const {
 | 
						|
		return MTP_geoPoint(
 | 
						|
			MTP_double(_lon),
 | 
						|
			MTP_double(_lat),
 | 
						|
			MTP_long(_access));
 | 
						|
	}
 | 
						|
 | 
						|
	float64 lat() const {
 | 
						|
		return _lat;
 | 
						|
	}
 | 
						|
	float64 lon() const {
 | 
						|
		return _lon;
 | 
						|
	}
 | 
						|
	uint64 accessHash() const {
 | 
						|
		return _access;
 | 
						|
	}
 | 
						|
 | 
						|
	inline size_t hash() const {
 | 
						|
#ifndef OS_MAC_OLD
 | 
						|
		return QtPrivate::QHashCombine().operator()(
 | 
						|
				std::hash<float64>()(_lat),
 | 
						|
				_lon);
 | 
						|
#else // OS_MAC_OLD
 | 
						|
		const auto h1 = std::hash<float64>()(_lat);
 | 
						|
		const auto h2 = std::hash<float64>()(_lon);
 | 
						|
		return ((h1 << 16) | (h1 >> 16)) ^ h2;
 | 
						|
#endif // OS_MAC_OLD
 | 
						|
	}
 | 
						|
 | 
						|
private:
 | 
						|
	static QString AsString(float64 value) {
 | 
						|
		constexpr auto kPrecision = 6;
 | 
						|
		return QString::number(value, 'f', kPrecision);
 | 
						|
	}
 | 
						|
 | 
						|
	friend inline bool operator==(const LocationPoint &a, const LocationPoint &b) {
 | 
						|
		return (a._lat == b._lat) && (a._lon == b._lon);
 | 
						|
	}
 | 
						|
 | 
						|
	friend inline bool operator<(const LocationPoint &a, const LocationPoint &b) {
 | 
						|
		return (a._lat < b._lat) || ((a._lat == b._lat) && (a._lon < b._lon));
 | 
						|
	}
 | 
						|
 | 
						|
	float64 _lat = 0;
 | 
						|
	float64 _lon = 0;
 | 
						|
	uint64 _access = 0;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
struct LocationThumbnail {
 | 
						|
	LocationThumbnail(const LocationPoint &point);
 | 
						|
 | 
						|
	LocationPoint point;
 | 
						|
	ImagePtr thumb;
 | 
						|
 | 
						|
	void load(FileOrigin origin);
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
} // namespace Data
 | 
						|
 | 
						|
namespace std {
 | 
						|
 | 
						|
template <>
 | 
						|
struct hash<Data::LocationPoint> {
 | 
						|
	size_t operator()(const Data::LocationPoint &value) const {
 | 
						|
		return value.hash();
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
} // namespace std
 |