xref: /haiku/headers/os/locale/Collator.h (revision 98057dd02a2411868fd4c35f7a48d20acfd92c23)
1 /*
2  * Copyright 2003-2011, 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 namespace icu {
14 	class Collator;
15 	class RuleBasedCollator;
16 };
17 
18 
19 class BString;
20 class BCollatorAddOn;
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 // N.B.: This class is not multithread-safe, as Compare() and GetKey() change
37 //       the ICUCollator (the strength). So if you want to use a BCollator from
38 //       more than one thread, you need to protect it with a lock
39 class BCollator : public BArchivable {
40 public:
41 								BCollator();
42 								BCollator(const char* locale,
43 									int8 strength = B_COLLATE_PRIMARY,
44 									bool ignorePunctuation = false);
45 								BCollator(BMessage* archive);
46 
47 								BCollator(const BCollator& other);
48 
49 								~BCollator();
50 
51 			BCollator&			operator=(const BCollator& source);
52 
53 			void				SetDefaultStrength(int8 strength);
54 			int8				DefaultStrength() const;
55 
56 			void				SetIgnorePunctuation(bool ignore);
57 			bool				IgnorePunctuation() const;
58 
59 			status_t			GetSortKey(const char* string, BString* key,
60 									int8 strength = B_COLLATE_DEFAULT) const;
61 
62 			int					Compare(const char* s1, const char* s2,
63 									int8 strength = B_COLLATE_DEFAULT) const;
64 			bool				Equal(const char* s1, const char* s2,
65 									int8 strength = B_COLLATE_DEFAULT) const;
66 			bool				Greater(const char* s1, const char* s2,
67 									int8 strength = B_COLLATE_DEFAULT) const;
68 			bool				GreaterOrEqual(const char* s1, const char* s2,
69 									int8 strength = B_COLLATE_DEFAULT) const;
70 
71 								// (un-)archiving API
72 			status_t			Archive(BMessage* archive, bool deep) const;
73 	static	BArchivable*		Instantiate(BMessage* archive);
74 
75 private:
76 			status_t			_SetStrength(int8 strength) const;
77 
78 			mutable icu::Collator*	fICUCollator;
79 			int8				fDefaultStrength;
80 			bool				fIgnorePunctuation;
81 };
82 
83 
84 inline bool
85 BCollator::Equal(const char *s1, const char *s2, int8 strength) const
86 {
87 	return Compare(s1, s2, strength) == 0;
88 }
89 
90 
91 inline bool
92 BCollator::Greater(const char *s1, const char *s2, int8 strength) const
93 {
94 	return Compare(s1, s2, strength) > 0;
95 }
96 
97 
98 inline bool
99 BCollator::GreaterOrEqual(const char *s1, const char *s2, int8 strength) const
100 {
101 	return Compare(s1, s2, strength) >= 0;
102 }
103 
104 
105 #endif	/* _COLLATOR_H_ */
106