1 /*
2 * Copyright 2003-2017, Haiku, Inc.
3 * Distributed under the terms of the MIT Licence.
4 */
5 #ifndef _COLLATOR_H_
6 #define _COLLATOR_H_
7
8
9 #include <Archivable.h>
10 #include <SupportDefs.h>
11
12
13 #ifndef U_ICU_NAMESPACE
14 #define U_ICU_NAMESPACE icu
15 #endif
16 namespace U_ICU_NAMESPACE {
17 class Collator;
18 };
19
20 class BString;
21
22
23 enum collator_strengths {
24 B_COLLATE_DEFAULT = -1,
25
26 B_COLLATE_PRIMARY = 1, // e.g.: no diacritical differences, e = é
27 B_COLLATE_SECONDARY, // diacritics are different from their base
28 // characters, a != ä
29 B_COLLATE_TERTIARY, // case sensitive comparison
30 B_COLLATE_QUATERNARY,
31
32 B_COLLATE_IDENTICAL = 127 // Unicode value
33 };
34
35
36 class BCollator : public BArchivable {
37 public:
38 BCollator();
39 BCollator(const char* locale,
40 int8 strength = B_COLLATE_PRIMARY,
41 bool ignorePunctuation = false);
42 BCollator(BMessage* archive);
43
44 BCollator(const BCollator& other);
45
46 ~BCollator();
47
48 BCollator& operator=(const BCollator& source);
49
50 status_t SetStrength(int8 strength) const;
51
52 void SetIgnorePunctuation(bool ignore);
53 bool IgnorePunctuation() const;
54
55 status_t SetNumericSorting(bool enable);
56
57 status_t GetSortKey(const char* string, BString* key)
58 const;
59
60 int Compare(const char* s1, const char* s2)
61 const;
62 bool Equal(const char* s1, const char* s2)
63 const;
64 bool Greater(const char* s1, const char* s2)
65 const;
66 bool GreaterOrEqual(const char* s1, const char* s2)
67 const;
68
69 // (un-)archiving API
70 status_t Archive(BMessage* archive, bool deep) const;
71 static BArchivable* Instantiate(BMessage* archive);
72
73 private:
74
75 mutable U_ICU_NAMESPACE::Collator* fICUCollator;
76 bool fIgnorePunctuation;
77 };
78
79
80 inline bool
Equal(const char * s1,const char * s2)81 BCollator::Equal(const char *s1, const char *s2) const
82 {
83 return Compare(s1, s2) == 0;
84 }
85
86
87 inline bool
Greater(const char * s1,const char * s2)88 BCollator::Greater(const char *s1, const char *s2) const
89 {
90 return Compare(s1, s2) > 0;
91 }
92
93
94 inline bool
GreaterOrEqual(const char * s1,const char * s2)95 BCollator::GreaterOrEqual(const char *s1, const char *s2) const
96 {
97 return Compare(s1, s2) >= 0;
98 }
99
100
101 #endif /* _COLLATOR_H_ */
102