xref: /haiku/headers/private/support/StringPrivate.h (revision d0f2d8282f3f59a1af7fe2d340d2af0cb36a9b20)
1 /*
2  * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _SUPPORT_BSTRING_PRIVATE_H_
6 #define _SUPPORT_BSTRING_PRIVATE_H_
7 
8 
9 #include <stdlib.h>
10 
11 #include <String.h>
12 
13 
14 class BString::Private {
15 public:
16 	static const uint32 kPrivateDataOffset = 2 * sizeof(int32);
17 
18 public:
Private(const BString & string)19 	Private(const BString& string)
20 		:
21 		fString(string)
22 	{
23 	}
24 
Data()25 	char* Data()
26 	{
27 		return fString.fPrivateData;
28 	}
29 
IsShareable()30 	bool IsShareable() const
31 	{
32 		return fString._IsShareable();
33 	}
34 
DataRefCount(char * data)35 	static int32& DataRefCount(char* data)
36 	{
37 		return *(((int32 *)data) - 2);
38 	}
39 
DataRefCount()40 	int32& DataRefCount()
41 	{
42 		return DataRefCount(Data());
43 	}
44 
DataLength(char * data)45 	static int32& DataLength(char* data)
46 	{
47 		return *(((int32*)data) - 1);
48 	}
49 
DataLength()50 	int32& DataLength()
51 	{
52 		return DataLength(Data());
53 	}
54 
IncrementDataRefCount(char * data)55 	static void IncrementDataRefCount(char* data)
56 	{
57 		if (data != NULL)
58 			atomic_add(&DataRefCount(data), 1);
59 	}
60 
DecrementDataRefCount(char * data)61 	static void DecrementDataRefCount(char* data)
62 	{
63 		if (data != NULL) {
64 			if (atomic_add(&DataRefCount(data), -1) == 1)
65 				free(data - kPrivateDataOffset);
66 		}
67 	}
68 
StringFromData(char * data)69 	static BString StringFromData(char* data)
70 	{
71 		return BString(data, BString::PRIVATE_DATA);
72 	}
73 
74 private:
75 	const BString&	fString;
76 };
77 
78 
79 #endif	// _SUPPORT_BSTRING_PRIVATE_H_
80 
81