1 // Copyright (c) 1994, 1997 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
5 #ifndef UnivCharsetDesc_INCLUDED
6 #define UnivCharsetDesc_INCLUDED 1
20 namespace SP_NAMESPACE
{
23 class SP_API UnivCharsetDesc
{
27 // Note that this is a count, as in the SGML declaration,
28 // rather than a maximum.
45 UnivCharsetDesc(const Range
*, size_t);
46 void set(const Range
*, size_t);
47 Boolean
descToUniv(WideChar from
, UnivChar
&to
) const;
48 Boolean
descToUniv(WideChar from
, UnivChar
&to
, WideChar
&alsoMax
) const;
49 // Return 0 for no matches, 1 for 1, 2 for more than 1
50 unsigned univToDesc(UnivChar from
, WideChar
&to
, ISet
<WideChar
> &toSet
)
52 unsigned univToDesc(UnivChar from
, WideChar
&to
, ISet
<WideChar
> &toSet
,
55 void addRange(WideChar descMin
, WideChar descMax
, UnivChar univMin
);
56 void addBaseRange(const UnivCharsetDesc
&baseSet
,
60 ISet
<WideChar
> &baseMissing
);
62 static Boolean
noDesc(Unsigned32 n
) {
63 return (n
& (unsigned(1) << 31));
65 static UnivChar
extractChar(Unsigned32 n
, Char ch
) {
66 return UnivChar((n
+ ch
) & ((unsigned(1) << 31) - 1));
68 static Unsigned32
wrapChar(UnivChar univ
, Char ch
) {
69 return Unsigned32((univ
- ch
) & ((unsigned(1) << 31) - 1));
71 // For characters <= charMax.<
72 CharMap
<Unsigned32
> charMap_
;
73 // For characters > charMax.
74 RangeMap
<WideChar
,UnivChar
> rangeMap_
;
75 friend class UnivCharsetDescIter
;
78 class SP_API UnivCharsetDescIter
{
80 UnivCharsetDescIter(const UnivCharsetDesc
&);
81 Boolean
next(WideChar
&descMin
, WideChar
&descMax
, UnivChar
&univMin
);
82 void skipTo(WideChar
);
84 const CharMap
<Unsigned32
> *charMap_
;
87 RangeMapIter
<WideChar
,UnivChar
> rangeMapIter_
;
91 Boolean
UnivCharsetDesc::descToUniv(WideChar from
, UnivChar
&to
) const
95 return rangeMap_
.map(from
, to
, tem
);
98 Unsigned32 tem
= charMap_
[from
];
102 to
= extractChar(tem
, from
);
109 Boolean
UnivCharsetDesc::descToUniv(WideChar from
, UnivChar
&to
,
110 WideChar
&alsoMax
) const
113 return rangeMap_
.map(from
, to
, alsoMax
);
116 Unsigned32 tem
= charMap_
.getRange(from
, max
);
121 to
= extractChar(tem
, from
);
128 unsigned UnivCharsetDesc::univToDesc(UnivChar from
, WideChar
&to
,
129 ISet
<WideChar
> &toSet
) const
132 return univToDesc(from
, to
, toSet
, tem
);
136 void UnivCharsetDescIter::skipTo(WideChar ch
)
148 #endif /* not UnivCharsetDesc_INCLUDED */