]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/string-handle.hh
*** empty log message ***
[lilypond.git] / flower / include / string-handle.hh
1 /*
2   string-handle.hh -- declare String_handle
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9
10 #ifndef STRINGHANDLE_HH
11 #define STRINGHANDLE_HH
12
13 #include "flower-proto.hh"
14
15
16 /**
17   Reference counting for strings.
18   
19    handles ref. counting, and provides a very thin interface using
20    Byte *
21
22    */
23 class String_handle {
24   String_data* data;
25     
26   /// decrease ref count. Named kind of like a Tanenbaum semafore 
27   void down ();
28
29   void up (String_data *d);
30     
31   /** make sure data has only one reference.      
32       POST: data->ref_count_ == 1
33   */
34   void copy ();
35     
36 public:
37   String_handle ();
38   ~String_handle ();
39   String_handle (String_handle const & src);
40
41   Byte const* to_bytes () const;
42   char const* to_str0 () const;
43   Byte* get_bytes ();
44   char* get_str0 ();    
45   bool is_binary_bo () const;
46   void operator = (String_handle const &src);
47   void operator += (char const *s);
48   Byte operator[] (int j) const;
49
50   /** Access elements. WARNING: NOT SAFE
51       don't use this for loops. Use to_bytes ()
52   */
53   Byte &operator[] (int j);
54   void append (Byte const* byte, int length_i);
55   void set (Byte const* byte, int length_i);
56   void operator = (char const *p);
57   void trunc (int j);
58   int length () const;
59 };
60
61 #ifdef STRING_UTILS_INLINED
62 #ifndef INLINE
63 #define INLINE inline
64 #endif
65 #include "string-handle.icc"
66 /* we should be resetting INLINE. oh well. */
67 #endif
68
69
70 #endif // STRINGHANDLE_HH