/usr/include/OpenSP/CharMap.h is in libosp-dev 1.5.2-10ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | // Copyright (c) 1997 James Clark, 2000 Matthias Clasen
// See the file COPYING for copying permission.
#ifndef CharMap_INCLUDED
#define CharMap_INCLUDED 1
#include "types.h"
#include "Resource.h"
#ifdef SP_NAMESPACE
namespace SP_NAMESPACE {
#endif
#ifdef SP_MULTI_BYTE
class CharMapBits {
public:
// 21 bits are enough for the UTF-16 range
enum { level0 = 5, level1 = 8, level2 = 4, level3 = 4 };
enum {
planes = (1 << CharMapBits::level0) ,
pagesPerPlane = (1 << CharMapBits::level1),
columnsPerPage = (1 << CharMapBits::level2),
cellsPerColumn = (1 << CharMapBits::level3),
planeSize = (1 << (CharMapBits::level1 + CharMapBits::level2 + CharMapBits::level3)),
pageSize = (1 << (CharMapBits::level2 + CharMapBits::level3)),
columnSize = (1 << CharMapBits::level3)
};
static size_t planeIndex(size_t c) {
return (c >> (CharMapBits::level1 + CharMapBits::level2 + CharMapBits::level3));
}
static size_t pageIndex(size_t c) {
return ((c >> (CharMapBits::level2 + CharMapBits::level3)) & (pagesPerPlane - 1));
}
static size_t columnIndex(size_t c) {
return ((c >> CharMapBits::level3) & (columnsPerPage - 1));
}
static size_t cellIndex(size_t c) {
return (c & (cellsPerColumn - 1));
}
static size_t maxInPlane(size_t c) {
return (c | (planeSize - 1));
}
static size_t maxInPage(size_t c) {
return (c | (pageSize - 1));
}
static size_t maxInColumn(size_t c) {
return (c | (columnSize - 1));
}
};
#if 0
// These are defines rather than static member functions of CharMapBits,
// since gcc chokes on them in array allocations.
#define planes (1 << CharMapBits::level0)
#define pagesPerPlane (1 << CharMapBits::level1)
#define columnsPerPage (1 << CharMapBits::level2)
#define cellsPerColumn (1 << CharMapBits::level3)
#define planeSize (1 << (CharMapBits::level1 + CharMapBits::level2 + CharMapBits::level3))
#define pageSize (1 << (CharMapBits::level2 + CharMapBits::level3))
#define columnSize (1 << CharMapBits::level3)
#define planeIndex(c) ((c) >> (CharMapBits::level1 + CharMapBits::level2 + CharMapBits::level3))
#define pageIndex(c) (((c) >> (CharMapBits::level2 + CharMapBits::level3)) & (pagesPerPlane - 1))
#define columnIndex(c) (((c) >> CharMapBits::level3) & (columnsPerPage - 1))
#define cellIndex(c) ((c) & (cellsPerColumn - 1))
#define maxInPlane(c) ((c) | (planeSize - 1))
#define maxInPage(c) ((c) | (pageSize - 1))
#define maxInColumn(c) ((c) | (columnSize - 1))
#endif
template<class T>
class CharMapColumn {
public:
CharMapColumn();
CharMapColumn(const CharMapColumn<T> &);
void operator=(const CharMapColumn<T> &);
~CharMapColumn();
T *values;
T value;
};
template<class T>
class CharMapPage {
public:
CharMapPage();
CharMapPage(const CharMapPage<T> &);
void operator=(const CharMapPage<T> &);
~CharMapPage();
void swap(CharMapPage<T> &);
CharMapColumn<T> *values;
T value;
};
template<class T>
class CharMapPlane {
public:
CharMapPlane();
CharMapPlane(const CharMapPlane<T> &);
void operator=(const CharMapPlane<T> &);
~CharMapPlane();
void swap(CharMapPlane<T> &);
CharMapPage<T> *values;
T value;
};
#endif /* SP_MULTI_BYTE */
template<class T>
class CharMap {
public:
CharMap();
CharMap(T);
T operator[](Char) const;
T getRange(Char from, Char &to) const;
void swap(CharMap<T> &);
void setChar(Char, T);
void setRange(Char from, Char to, T val);
void setAll(T);
private:
#ifdef SP_MULTI_BYTE
CharMapPlane<T> values_[CharMapBits::planes];
T lo_[256];
#else
T values_[256];
#endif
};
template<class T>
class CharMapResource : public CharMap<T>, public Resource {
public:
CharMapResource() { }
CharMapResource(T t) : CharMap<T>(t) { }
};
#ifdef SP_MULTI_BYTE
template<class T>
inline
T CharMap<T>::operator[](Char c) const
{
if (c < 256)
return lo_[c];
const CharMapPlane<T> &pl = values_[CharMapBits::planeIndex(c)];
if (pl.values) {
const CharMapPage<T> &pg = pl.values[CharMapBits::pageIndex(c)];
if (pg.values) {
const CharMapColumn<T> &column = pg.values[CharMapBits::columnIndex(c)];
if (column.values)
return column.values[CharMapBits::cellIndex(c)];
else
return column.value;
}
else
return pg.value;
}
else
return pl.value;
}
template<class T>
inline
T CharMap<T>::getRange(Char c, Char &max) const
{
if (c < 256) {
max = c;
return lo_[c];
}
const CharMapPlane<T> &pl = values_[CharMapBits::planeIndex(c)];
if (pl.values) {
const CharMapPage<T> &pg = pl.values[CharMapBits::pageIndex(c)];
if (pg.values) {
const CharMapColumn<T> &column = pg.values[CharMapBits::columnIndex(c)];
if (column.values) {
max = c;
return column.values[CharMapBits::cellIndex(c)];
}
else {
max = CharMapBits::maxInColumn(c);
return column.value;
}
}
else {
max = CharMapBits::maxInPage(c);
return pg.value;
}
}
else {
max = CharMapBits::maxInPlane(c);
return pl.value;
}
}
#else
template<class T>
inline
T CharMap<T>::operator[](Char c) const
{
return values_[c];
}
template<class T>
inline
T CharMap<T>::getRange(Char c, Char &max) const
{
max = c;
return values_[c];
}
template<class T>
inline
void CharMap<T>::setChar(Char c, T val)
{
values_[c] = val;
}
#endif
#ifdef SP_NAMESPACE
}
#endif
#endif /* not CharMap_INCLUDED */
#ifdef SP_DEFINE_TEMPLATES
#include "CharMap.cxx"
#endif
|