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