/src/gdal/ogr/ogr_proj_p.h
Line | Count | Source (jump to first uncovered line) |
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 | | void operator()(PJ *pj) const |
34 | 0 | { |
35 | 0 | proj_destroy(pj); |
36 | 0 | } |
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 | | EPSGCacheKey(int nCode, bool bUseNonDeprecated, bool bAddTOWGS84) |
48 | 0 | : nCode_(nCode), bUseNonDeprecated_(bUseNonDeprecated), |
49 | 0 | bAddTOWGS84_(bAddTOWGS84) |
50 | 0 | { |
51 | 0 | } |
52 | | |
53 | | bool operator==(const EPSGCacheKey &other) const |
54 | 0 | { |
55 | 0 | return nCode_ == other.nCode_ && |
56 | 0 | bUseNonDeprecated_ == other.bUseNonDeprecated_ && |
57 | 0 | bAddTOWGS84_ == other.bAddTOWGS84_; |
58 | 0 | } |
59 | | }; |
60 | | |
61 | | struct EPSGCacheKeyHasher |
62 | | { |
63 | | std::size_t operator()(const EPSGCacheKey &k) const |
64 | 0 | { |
65 | 0 | return k.nCode_ | ((k.bUseNonDeprecated_ ? 1 : 0) << 16) | |
66 | 0 | ((k.bAddTOWGS84_ ? 1 : 0) << 17); |
67 | 0 | } |
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 | 0 | explicit OSRProjTLSCache(PJ_CONTEXT *tlsContext) : m_tlsContext(tlsContext) |
87 | 0 | { |
88 | 0 | } |
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 |