OpenSubdiv
Loading...
Searching...
No Matches
surfaceFactoryCache.h
Go to the documentation of this file.
1//
2// Copyright 2021 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://opensubdiv.org/license.
6//
7
8#ifndef OPENSUBDIV3_BFR_SURFACE_FACTORY_CACHE_H
9#define OPENSUBDIV3_BFR_SURFACE_FACTORY_CACHE_H
10
11#include "../version.h"
12
13#include "../bfr/irregularPatchType.h"
14
15#include <map>
16#include <cstdint>
17
18namespace OpenSubdiv {
19namespace OPENSUBDIV_VERSION {
20
21namespace Bfr {
22
35//
36// Initial/expected use requires simple searches of and additions to the
37// cache by the SurfaceFactory or its Builders. Longer term, with the
38// possibility of instances of caches being shared between meshes and
39// factories, additional options and/or public methods may be warranted
40// to limit what is cached or to prune the cache if it gets too large.
41//
43public:
46
49
50protected:
52 // Access restricted to the Factory, its Builders, etc.
53 friend class SurfaceFactory;
54
55 typedef std::uint64_t KeyType;
56 typedef internal::IrregularPatchSharedPtr DataType;
58
59protected:
61 size_t Size() const { return _map.size(); }
62
63 //
64 // Potential overrides by subclasses for thread-safety:
65 //
66 virtual DataType Find(KeyType const & key) const;
67 virtual DataType Add(KeyType const & key, DataType const & data);
68
69 //
70 // Common implementation used by all subclasses:
71 //
72 DataType find(KeyType const & key) const;
73 DataType add(KeyType const & key, DataType const & data);
75
76private:
77 typedef std::map<KeyType, DataType> MapType;
78
79 MapType _map;
80};
81
96// Separate read and write locks are provided to support mutex types
97// allowing shared (read) or exclusive (write) access.
98//
99template <class MUTEX_TYPE, class READ_LOCK_GUARD_TYPE,
100 class WRITE_LOCK_GUARD_TYPE>
102public:
104 ~SurfaceFactoryCacheThreaded() override = default;
105
106protected:
108 //
109 // Virtual overrides from base:
110 //
111 DataType Find(KeyType const & key) const override {
112 READ_LOCK_GUARD_TYPE lockGuard(_mutex);
113 return find(key);
114 }
115
116 DataType Add(KeyType const & key, DataType const & data) override {
117 WRITE_LOCK_GUARD_TYPE lockGuard(_mutex);
118 return add(key, data);
119 }
121
122private:
123 MUTEX_TYPE mutable _mutex;
124};
125
126} // end namespace Bfr
127
128} // end namespace OPENSUBDIV_VERSION
129using namespace OPENSUBDIV_VERSION;
130
131} // end namespace OpenSubdiv
132
133#endif /* OPENSUBDIV3_BFR_SURFACE_FACTORY_CACHE_H */
Base class providing initialization of a Surface for each face of a mesh.
Container used internally by SurfaceFactory to store reusable information.
SurfaceFactoryCache(SurfaceFactoryCache const &)=delete
SurfaceFactoryCache & operator=(SurfaceFactoryCache const &)=delete
Template for declaring thread-safe subclasses of SurfaceFactoryCache.