1 #ifndef __GNUC__
2 #pragma once
3 #endif
4 #ifndef __XR_REMAPPER_H__
5 #define __XR_REMAPPER_H__
6
7 #include <memory>
8 #include "xr_types.h"
9
10 namespace xray_re {
11
12 class xr_remapper {
13 public:
14 xr_remapper(uint32_t min, uint32_t max);
15 xr_remapper(size_t size);
16 ~xr_remapper();
17
18 uint32_t operator[](uint32_t value) const;
19 uint32_t& operator[](uint32_t value);
20 uint32_t min() const;
21 uint32_t max() const;
22
23 private:
24 uint32_t m_min, m_max;
25 uint32_t* m_mapping;
26 };
27
xr_remapper(size_t size)28 inline xr_remapper::xr_remapper(size_t size):
29 m_min(0), m_max(uint32_t(size & UINT32_MAX) - 1)
30 {
31 m_mapping = new uint32_t[size];
32 #if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1600
33 stdext::unchecked_uninitialized_fill_n(m_mapping, size, BAD_IDX);
34 #else
35 std::uninitialized_fill_n(m_mapping, size, BAD_IDX);
36 #endif
37 }
38
xr_remapper(uint32_t min,uint32_t max)39 inline xr_remapper::xr_remapper(uint32_t min, uint32_t max): m_min(min), m_max(max)
40 {
41 m_mapping = new uint32_t[max - min + 1];
42 #if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1600
43 stdext::unchecked_uninitialized_fill_n(m_mapping, max - min + 1, BAD_IDX);
44 #else
45 std::uninitialized_fill_n(m_mapping, max - min + 1, BAD_IDX);
46 #endif
47 }
48
~xr_remapper()49 inline xr_remapper::~xr_remapper()
50 {
51 delete[] m_mapping;
52 }
53
54 inline uint32_t xr_remapper::operator[](uint32_t value) const
55 {
56 if (value < m_min || value > m_max)
57 return BAD_IDX;
58 return uint32_t(m_mapping[value - m_min]);
59 }
60
61 inline uint32_t& xr_remapper::operator[](uint32_t value)
62 {
63 xr_assert(value >= m_min);
64 xr_assert(value <= m_max);
65 return m_mapping[value - m_min];
66 }
67
min()68 inline uint32_t xr_remapper::min() const { return m_min; }
max()69 inline uint32_t xr_remapper::max() const { return m_max; }
70
71 } // end of namespace xray_re
72
73 #endif
74