Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: Private header 5 : * Author: Even Rouault <even dot rouault at spatialys dot com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2018, Even Rouault <even dot rouault at spatialys dot com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef OGR_PROJ_P_H_INCLUDED 14 : #define OGR_PROJ_P_H_INCLUDED 15 : 16 : #include "proj.h" 17 : 18 : #include "cpl_mem_cache.h" 19 : 20 : #include <unordered_map> 21 : #include <memory> 22 : #include <utility> 23 : 24 : /*! @cond Doxygen_Suppress */ 25 : 26 : PJ_CONTEXT CPL_DLL *OSRGetProjTLSContext(); 27 : void OSRCleanupTLSContext(); 28 : 29 : class OSRProjTLSCache 30 : { 31 : struct OSRPJDeleter 32 : { 33 9285 : void operator()(PJ *pj) const 34 : { 35 9285 : proj_destroy(pj); 36 9285 : } 37 : }; 38 : 39 : typedef std::unique_ptr<PJ, OSRPJDeleter> UniquePtrPJ; 40 : 41 : struct EPSGCacheKey 42 : { 43 : int nCode_; 44 : bool bUseNonDeprecated_; 45 : bool bAddTOWGS84_; 46 : 47 42297 : EPSGCacheKey(int nCode, bool bUseNonDeprecated, bool bAddTOWGS84) 48 42297 : : nCode_(nCode), bUseNonDeprecated_(bUseNonDeprecated), 49 42297 : bAddTOWGS84_(bAddTOWGS84) 50 : { 51 42297 : } 52 : 53 32370 : bool operator==(const EPSGCacheKey &other) const 54 : { 55 64741 : return nCode_ == other.nCode_ && 56 64740 : bUseNonDeprecated_ == other.bUseNonDeprecated_ && 57 64740 : bAddTOWGS84_ == other.bAddTOWGS84_; 58 : } 59 : }; 60 : 61 : struct EPSGCacheKeyHasher 62 : { 63 56142 : std::size_t operator()(const EPSGCacheKey &k) const 64 : { 65 56142 : return k.nCode_ | ((k.bUseNonDeprecated_ ? 1 : 0) << 16) | 66 56142 : ((k.bAddTOWGS84_ ? 1 : 0) << 17); 67 : } 68 : }; 69 : 70 : PJ_CONTEXT *m_tlsContext = 71 : nullptr; // never use it directly. use GetPJContext() 72 : lru11::Cache<EPSGCacheKey, UniquePtrPJ, lru11::NullLock, 73 : std::unordered_map<EPSGCacheKey, 74 : typename std::list<lru11::KeyValuePair< 75 : EPSGCacheKey, UniquePtrPJ>>::iterator, 76 : EPSGCacheKeyHasher>> 77 : m_oCacheEPSG{}; 78 : lru11::Cache<std::string, UniquePtrPJ> m_oCacheWKT{}; 79 : 80 : PJ_CONTEXT *GetPJContext(); 81 : 82 : OSRProjTLSCache(const OSRProjTLSCache &) = delete; 83 : OSRProjTLSCache &operator=(const OSRProjTLSCache &) = delete; 84 : 85 : public: 86 1296 : explicit OSRProjTLSCache(PJ_CONTEXT *tlsContext) : m_tlsContext(tlsContext) 87 : { 88 1295 : } 89 : 90 : void clear(); 91 : 92 : PJ *GetPJForEPSGCode(int nCode, bool bUseNonDeprecated, bool bAddTOWGS84); 93 : void CachePJForEPSGCode(int nCode, bool bUseNonDeprecated, bool bAddTOWGS84, 94 : PJ *pj); 95 : 96 : PJ *GetPJForWKT(const std::string &wkt); 97 : void CachePJForWKT(const std::string &wkt, PJ *pj); 98 : }; 99 : 100 : OSRProjTLSCache *OSRGetProjTLSCache(); 101 : 102 : void OGRCTDumpStatistics(); 103 : 104 : void OSRCTCleanCache(); 105 : 106 : /*! @endcond Doxygen_Suppress */ 107 : 108 : #endif