xref: /haiku/headers/private/userlandfs/shared/String.h (revision 21258e2674226d6aa732321b6f8494841895af5f)
1 // String.h
2 
3 #ifndef STRING_H
4 #define STRING_H
5 
6 #include <string.h>
7 
8 #include <SupportDefs.h>
9 
10 
11 // string_hash
12 //
13 // from the Dragon Book: a slightly modified hashpjw()
14 static inline
15 uint32
16 string_hash(const char *name)
17 {
18 	uint32 h = 0;
19 	if (name) {
20 		for (; *name; name++) {
21 			uint32 g = h & 0xf0000000;
22 			if (g)
23 				h ^= g >> 24;
24 			h = (h << 4) + *name;
25 		}
26 	}
27 	return h;
28 }
29 
30 #ifdef __cplusplus
31 
32 namespace UserlandFSUtil {
33 
34 // String
35 class String {
36 public:
37 	String();
38 	String(const String &string);
39 	String(const char *string, int32 length = -1);
40 	~String();
41 
42 	bool SetTo(const char *string, int32 maxLength = -1);
43 	void Unset();
44 
45 	void Truncate(int32 newLength);
46 
47 	const char *GetString() const;
48 	int32 GetLength() const	{ return fLength; }
49 
50 	uint32 GetHashCode() const	{ return string_hash(GetString()); }
51 
52 	String &operator=(const String &string);
53 	bool operator==(const String &string) const;
54 	bool operator!=(const String &string) const { return !(*this == string); }
55 
56 private:
57 	bool _SetTo(const char *string, int32 length);
58 
59 private:
60 	int32	fLength;
61 	char	*fString;
62 };
63 
64 }	// namespace UserlandFSUtil
65 
66 using UserlandFSUtil::String;
67 
68 #endif	// __cplusplus
69 
70 #endif	// STRING_H
71