File: map_memory.h

package info (click to toggle)
cataclysm-dda 0.C%2Bgit20190228.faafa3a-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 181,636 kB
  • sloc: cpp: 256,609; python: 2,621; makefile: 862; sh: 495; perl: 37; xml: 33
file content (63 lines) | stat: -rw-r--r-- 1,711 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#pragma once
#ifndef MAP_MEMORY_H
#define MAP_MEMORY_H

#include <list>
#include <string>
#include <unordered_map>

#include "enums.h" // IWYU pragma: keep

class JsonOut;
class JsonObject;

struct memorized_terrain_tile {
    std::string tile;
    int subtile;
    int rotation;
};

template<typename T>
class lru_cache
{
    public:
        using Pair = std::pair<tripoint, T>;

        void insert( int limit, const tripoint &, const T & );
        T get( const tripoint &, const T &default_ ) const;
        void remove( const tripoint & );

        void clear();
        const std::list<Pair> &list() const;
    private:
        void trim( int limit );
        std::list<Pair> ordered_list;
        std::unordered_map<tripoint, typename std::list<Pair>::iterator> map;
};

extern template class lru_cache<memorized_terrain_tile>;
extern template class lru_cache<long>;

class map_memory
{
    public:
        void store( JsonOut &jsout ) const;
        void load( JsonIn &jsin );
        void load( JsonObject &jsin );

        /** Memorizes a given tile; finalize_tile_memory needs to be called after it */
        void memorize_tile( int limit, const tripoint &pos, const std::string &ter,
                            const int subtile, const int rotation );
        /** Returns last stored map tile in given location */
        memorized_terrain_tile get_tile( const tripoint &pos ) const;

        void memorize_symbol( int limit, const tripoint &pos, const long symbol );
        long get_symbol( const tripoint &pos ) const;

        void clear_memorized_tile( const tripoint &pos );
    private:
        lru_cache<memorized_terrain_tile> tile_cache;
        lru_cache<long> symbol_cache;
};

#endif