Commit 2c9501c4a98b60f0cdf7b37415db544b2f8555b2

Authored by Grzegorz Jabłoński
1 parent 36081a4f

Removed buggy operator=(char*) from string.

Showing 27 changed files with 2 additions and 1359 deletions
examples04/04-rcstring/rcstring.h
... ... @@ -15,7 +15,6 @@ rcstring();
15 15 rcstring(const char*);
16 16 rcstring(const rcstring&);
17 17 ~rcstring();
18   -rcstring& operator=(const char*);
19 18 rcstring& operator=(const rcstring&);
20 19 rcstring& operator+=(const rcstring &);
21 20 rcstring operator+(const rcstring &) const;
... ... @@ -54,20 +53,6 @@ struct rcstring::rctext
54 53 n--;
55 54 return t;
56 55 };
57   - void assign(unsigned int nsize, const char *p)
58   - {
59   - if(size!=nsize)
60   - {
61   - char* ns=new char[nsize+1];
62   - size = nsize;
63   - strncpy(ns,p,size);
64   - delete [] s;
65   - s = ns;
66   - }
67   - else
68   - strncpy(s,p,size);
69   - s[size]='\0';
70   - }
71 56 private:
72 57 rctext(const rctext&);
73 58 rctext& operator=(const rctext&);
... ... @@ -103,19 +88,6 @@ rcstring::rcstring(const char* s)
103 88 data=new rctext(strlen(s),s);
104 89 }
105 90  
106   -rcstring& rcstring::operator=(const char* s)
107   -{
108   - if(data->n==1)
109   - data->assign(strlen(s),s);
110   - else
111   - {
112   - rctext* t = new rctext(strlen(s),s);
113   - data->n--;
114   - data= t;
115   - };
116   - return *this;
117   -}
118   -
119 91 ostream& operator << (ostream& o, const rcstring& s)
120 92 {
121 93 return o<<s.data->s;
... ...
examples04/05-rcstring/rcstring.h
... ... @@ -16,7 +16,6 @@ rcstring();
16 16 rcstring(const char*);
17 17 rcstring(const rcstring&);
18 18 ~rcstring();
19   -rcstring& operator=(const char*);
20 19 rcstring& operator=(const rcstring&);
21 20 rcstring& operator+=(const rcstring &);
22 21 rcstring operator+(const rcstring &) const;
... ... @@ -54,20 +53,6 @@ struct rcstring::rctext
54 53 n--;
55 54 return t;
56 55 };
57   - void assign(unsigned int nsize, const char *p)
58   - {
59   - if(size!=nsize)
60   - {
61   - char* ns=new char[nsize+1];
62   - size = nsize;
63   - strncpy(ns,p,size);
64   - delete [] s;
65   - s = ns;
66   - }
67   - else
68   - strncpy(s,p,size);
69   - s[size]='\0';
70   - }
71 56 private:
72 57 rctext(const rctext&);
73 58 rctext& operator=(const rctext&);
... ... @@ -126,19 +111,6 @@ rcstring::rcstring(const char* s)
126 111 data=new rctext(strlen(s),s);
127 112 }
128 113  
129   -rcstring& rcstring::operator=(const char* s)
130   -{
131   - if(data->n==1)
132   - data->assign(strlen(s),s);
133   - else
134   - {
135   - rctext* t = new rctext(strlen(s),s);
136   - data->n--;
137   - data= t;
138   - };
139   - return *this;
140   -}
141   -
142 114 ostream& operator << (ostream& o, const rcstring& s)
143 115 {
144 116 return o<<s.data->s;
... ...
examples04/06-threads/makefile
1   -all: threads1 threads2 volatile1 volatile2 threads1_cxx11 threads2_cxx11 volatile1_cxx11 volatile1_cxx11.s volatile2_cxx11 volatile2_cxx11.s
  1 +all: threads1 threads1_cxx11 threads2_cxx11 volatile1_cxx11 volatile1_cxx11.s volatile2_cxx11 volatile2_cxx11.s
2 2  
3 3 threads1: threads1.o
4 4 g++ -g $^ -lpthread -o$@
... ... @@ -6,12 +6,6 @@ threads1: threads1.o
6 6 threads1.o: threads1.cpp
7 7 g++ -g -c -Wall -pedantic $< -o $@
8 8  
9   -threads2: threads2.o
10   - g++ -g $^ -o $@ -lpthread
11   -
12   -threads2.o: threads2.cpp rcstring.h
13   - g++ -g -c -Wall -pedantic $< -o $@
14   -
15 9 threads1_cxx11: threads1_cxx11.cpp
16 10 g++ -g -std=c++11 -pthread -Wall -pedantic $< -o $@
17 11  
... ... @@ -30,27 +24,8 @@ volatile2_cxx11: volatile2_cxx11.cpp
30 24 volatile2_cxx11.s: volatile2_cxx11.cpp
31 25 g++ -g -std=c++11 -pthread -Wall -pedantic -S -O2 $< -o $@
32 26  
33   -volatile1: volatile1.o
34   - g++ -g $^ -o $@ -lpthread
35   -
36   -volatile1.o: volatile1.s
37   - g++ -g -c $< -o $@
38   -
39   -volatile1.s: volatile1.cpp
40   - g++ -O2 -S -g -c -Wall -pedantic $< -o $@
41   -
42   -
43   -volatile2: volatile2.o
44   - g++ -g $^ -o $@ -lpthread
45   -
46   -volatile2.o: volatile2.s
47   - g++ -g -c $< -o $@
48   -
49   -volatile2.s: volatile2.cpp
50   - g++ -O2 -S -g -c -Wall -pedantic $< -o $@
51   -
52 27  
53 28 .PHONY: clean
54 29  
55 30 clean:
56   - -rm threads1.o threads1 threads2.o threads2 volatile1.o volatile1 volatile2.o volatile2 volatile1.s volatile2.s threads1_cxx11 threads2_cxx11 volatile1_cxx11 volatile1_cxx11.s volatile2_cxx11 volatile2_cxx11.s
  31 + -rm threads1.o threads1 threads1_cxx11 threads2_cxx11 volatile1_cxx11 volatile1_cxx11.s volatile2_cxx11 volatile2_cxx11.s
... ...
examples04/06-threads/rcstring.h
... ... @@ -16,7 +16,6 @@ rcstring();
16 16 rcstring(const char*);
17 17 rcstring(const rcstring&);
18 18 ~rcstring();
19   -rcstring& operator=(const char*);
20 19 rcstring& operator=(const rcstring&);
21 20 rcstring& operator+=(const rcstring &);
22 21 rcstring operator+(const rcstring &) const;
... ... @@ -55,21 +54,6 @@ struct rcstring::rctext
55 54 n--;
56 55 return t;
57 56 };
58   - void assign(unsigned int nsize, const char *p)
59   - {
60   - if(size!=nsize)
61   - {
62   - char* ns=new char[size+1];
63   - size = nsize;
64   - strncpy(ns,p,size);
65   - delete [] s;
66   - size = nsize;
67   - s = ns;
68   - }
69   - else
70   - strncpy(s,p,size);
71   - s[size]='\0';
72   - }
73 57 private:
74 58 rctext(const rctext&);
75 59 rctext& operator=(const rctext&);
... ... @@ -129,19 +113,6 @@ rcstring::rcstring(const char* s)
129 113 data=new rctext(strlen(s),s);
130 114 }
131 115  
132   -rcstring& rcstring::operator=(const char* s)
133   -{
134   - if(data->n==1)
135   - data->assign(strlen(s),s);
136   - else
137   - {
138   - rctext* t = new rctext(strlen(s),s);
139   - data->n--;
140   - data= t;
141   - };
142   - return *this;
143   -}
144   -
145 116 ostream& operator << (ostream& o, const rcstring& s)
146 117 {
147 118 return o<<s.data->s;
... ...
examples04/06-threads/threads2.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include <pthread.h>
3   -#include "rcstring.h"
4   -
5   -
6   -rcstring s ("ala");
7   -
8   -void *
9   -thread1 (void *p)
10   -{
11   - int *pp = (int *) p;
12   - printf ("Parameter of thread1: %d\n", *pp);
13   - *pp = 1;
14   - for (unsigned int i = 0; i < 100000; i++)
15   - {
16   - printf ("Hello from thread 1\n");
17   - rcstring s1 (s);
18   - }
19   - pthread_exit (p);
20   -}
21   -
22   -void *
23   -thread2 (void *p)
24   -{
25   - int *pp = (int *) p;
26   - printf ("Parameter of thread2: %d\n", *pp);
27   - *pp = 2;
28   - for (unsigned int i = 0; i < 100000; i++)
29   - {
30   - printf ("Hello from thread 2\n");
31   - rcstring s1 (s);
32   - }
33   - pthread_exit (p);
34   -}
35   -
36   -
37   -int
38   -main ()
39   -{
40   - pthread_t t1;
41   - pthread_t t2;
42   - int *retval1;
43   - int *retval2;
44   - int r1 = 10, r2 = 11;
45   -
46   -
47   - pthread_create (&t1, NULL, thread1, &r1);
48   - pthread_create (&t2, NULL, thread2, &r2);
49   -
50   - pthread_join (t1, (void **) &retval1);
51   - pthread_join (t2, (void **) &retval2);
52   -
53   - printf ("%d\n", *retval1);
54   - printf ("%d\n", *retval2);
55   - printf ("RefCount=%d\n", s.getRefCount ());
56   -}
examples04/06-threads/volatile1.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include <pthread.h>
3   -
4   -int val = 0;
5   -
6   -void *
7   -fun1 (void *)
8   -{
9   - val = 0;
10   - while (1)
11   - if (val != 0)
12   - break;
13   - printf ("out of the loop\n");
14   - pthread_exit (NULL);
15   -}
16   -
17   -
18   -int
19   -main ()
20   -{
21   - pthread_t w;
22   -
23   - pthread_create (&w, NULL, fun1, NULL);
24   - val = 1;
25   - pthread_join (w, NULL);
26   -}
examples04/06-threads/volatile2.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include <pthread.h>
3   -
4   -volatile int val = 0;
5   -
6   -void *
7   -fun1 (void *)
8   -{
9   - val = 0;
10   - while (1)
11   - if (val != 0)
12   - break;
13   - printf ("out of the loop\n");
14   - pthread_exit (NULL);
15   -}
16   -
17   -
18   -int
19   -main ()
20   -{
21   - pthread_t w;
22   -
23   - pthread_create (&w, NULL, fun1, NULL);
24   - val = 1;
25   - pthread_join (w, NULL);
26   -}
examples04/07-threads2/makefile deleted 100644 → 0
1   -all: threads1 threads2 threads3 threads3 threads4 threads5
2   -
3   -threads1: threads1.o
4   - g++ -g $^ -o $@ -lpthread
5   -
6   -threads1.o: threads1.cpp rcstring1.h
7   - g++ -g -c -Wall -pedantic $< -o $@
8   -
9   -threads2: threads2.o
10   - g++ -g $^ -o $@ -lpthread
11   -
12   -threads2.o: threads2.cpp rcstring2.h
13   - g++ -g -c -Wall -pedantic $< -o $@
14   -
15   -threads3: threads3.o
16   - g++ -g $^ -o $@ -lpthread
17   -
18   -threads3.o: threads3.cpp rcstring3.h
19   - g++ -g -c -Wall -pedantic $< -o $@
20   -
21   -threads4: threads4.o
22   - g++ -g $^ -o $@ -lpthread
23   -
24   -threads4.o: threads4.cpp
25   - g++ -g -c -Wall -pedantic $< -o $@
26   -
27   -threads5: threads5.o
28   - g++ -g $^ -o $@ -lpthread
29   -
30   -threads5.o: threads5.cpp mystring.h
31   - g++ -g -c -Wall -pedantic $< -o $@
32   -
33   -
34   -.PHONY: clean
35   -
36   -clean:
37   - -rm threads1.o threads1 threads2.o threads2 threads3.o threads3 threads4.o threads4 threads5.o threads5
examples04/07-threads2/rcstring2.h deleted 100644 → 0
1   -#ifndef __RCSTRING_H__
2   -#define __RCSTRING_H__
3   -#include <string.h>
4   -#include <stdio.h>
5   -#include <pthread.h>
6   -#include <iostream>
7   -using namespace std;
8   -
9   -class rcstring
10   -{
11   - struct rctext;
12   - rctext *data;
13   -public:
14   - class Range
15   - {
16   - };
17   - class Cref;
18   - rcstring ();
19   - rcstring (const char *);
20   - rcstring (const rcstring &);
21   - ~rcstring ();
22   - rcstring & operator= (const char *);
23   - rcstring & operator= (const rcstring &);
24   - rcstring & operator+= (const rcstring &);
25   - rcstring operator+ (const rcstring &) const;
26   - friend ostream & operator<< (ostream &, const rcstring &);
27   - void check (unsigned int i) const;
28   - char read (unsigned int i) const;
29   - void write (unsigned int i, char c);
30   - char operator[] (unsigned int i) const;
31   - Cref operator[] (unsigned int i);
32   - unsigned int getRefCount ();
33   -};
34   -
35   -struct rcstring::rctext
36   -{
37   - char *s;
38   - unsigned int size;
39   - unsigned int n;
40   - pthread_mutex_t mutex;
41   -
42   - rctext (unsigned int nsize, const char *p)
43   - {
44   - n = 1;
45   - size = nsize;
46   - s = new char[size + 1];
47   - strncpy (s, p, size);
48   - s[size] = '\0';
49   - pthread_mutex_init (&mutex, NULL);
50   - };
51   - ~rctext ()
52   - {
53   - delete[]s;
54   - pthread_mutex_destroy(&mutex);
55   - };
56   - unsigned int AtomicRead()
57   - {
58   - unsigned int retval;
59   - pthread_mutex_lock(&mutex);
60   - retval = n;
61   - pthread_mutex_unlock(&mutex);
62   - return retval;
63   - };
64   -
65   - unsigned int AtomicIncrement()
66   - {
67   - pthread_mutex_lock(&mutex);
68   - unsigned int retval=++n;
69   - pthread_mutex_unlock(&mutex);
70   - return retval;
71   - };
72   -
73   - unsigned int AtomicDecrement()
74   - {
75   - pthread_mutex_lock(&mutex);
76   - unsigned int retval=--n;
77   - pthread_mutex_unlock(&mutex);
78   - return retval;
79   - };
80   -
81   - void assign (unsigned int nsize, const char *p)
82   - {
83   - if (size != nsize)
84   - {
85   - char *ns = new char[size + 1];
86   - size = nsize;
87   - strncpy (ns, p, size);
88   - delete[]s;
89   - size = nsize;
90   - s = ns;
91   - }
92   - else
93   - strncpy (s, p, size);
94   - s[size] = '\0';
95   - }
96   -
97   -private:
98   - rctext (const rctext &);
99   - rctext & operator= (const rctext &);
100   -};
101   -
102   -class
103   - rcstring::Cref
104   -{
105   - friend class rcstring;
106   - rcstring & s;
107   - int i;
108   - Cref (rcstring & ss, unsigned int ii): s (ss), i (ii) {};
109   -public:
110   - operator char () const
111   - {
112   - return s.read (i);
113   - }
114   - rcstring::Cref &
115   - operator = (char c)
116   - {
117   - s.write (i, c);
118   - return *this;
119   - };
120   - rcstring::Cref & operator = (const Cref & ref)
121   - {
122   - return operator= ((char) ref);
123   - };
124   -};
125   -inline
126   -rcstring::rcstring ()
127   -{
128   - data = new rctext (0, "");
129   -}
130   -
131   -inline
132   -rcstring::rcstring (const rcstring & x)
133   -{
134   - x.data->AtomicIncrement();
135   - data = x.data;
136   -}
137   -
138   -inline
139   -rcstring::~rcstring ()
140   -{
141   - if(data->AtomicDecrement()==0)
142   - delete data;
143   -}
144   -
145   -rcstring & rcstring::operator= (const rcstring & x)
146   -{
147   - rctext* olddata=data;
148   - x.data->AtomicIncrement();
149   - data = x.data;
150   - if(olddata->AtomicDecrement()==0)
151   - delete olddata;
152   - return *this;
153   -}
154   -
155   -rcstring::rcstring (const char *s)
156   -{
157   - data = new rctext (strlen (s), s);
158   -}
159   -
160   -rcstring & rcstring::operator= (const char *s)
161   -{
162   - if (data->AtomicRead() == 1)
163   - data->assign (strlen (s), s);
164   - else
165   - {
166   - rctext* olddata=data;
167   - data = new rctext (strlen (s), s);
168   - if(olddata->AtomicDecrement()==0)
169   - delete olddata;
170   - };
171   - return *this;
172   -}
173   -
174   -ostream & operator << (ostream & o, const rcstring & s)
175   -{
176   - return o << s.data->s;
177   -}
178   -
179   -rcstring & rcstring::operator+= (const rcstring & s)
180   -{
181   - int newsize = data->size + s.data->size;
182   - rctext * newdata = new rctext (newsize, data->s);
183   - strcat (newdata->s, s.data->s);
184   - rctext* olddata=data;
185   - data=newdata;
186   - if(olddata->AtomicDecrement()==0)
187   - delete olddata;
188   - return *this;
189   -}
190   -
191   -rcstring
192   -rcstring::operator+ (const rcstring & s) const
193   -{
194   - return rcstring (*this) += s;
195   -}
196   -
197   -inline void
198   -rcstring::check (unsigned int i) const
199   -{
200   - if (data->size <= i)
201   - throw Range ();
202   -}
203   -
204   -inline char
205   -rcstring::read (unsigned int i) const
206   -{
207   - return data->s[i];
208   -}
209   -
210   -inline void
211   -rcstring::write (unsigned int i, char c)
212   -{
213   - if (data->AtomicRead() > 1)
214   - {
215   - rctext* newdata=new rctext(data->size,data->s);
216   - rctext* olddata=data;
217   - data=newdata;
218   - if(olddata->AtomicDecrement() == 0)
219   - delete olddata;
220   - }
221   - data->s[i] = c;
222   -}
223   -
224   -char
225   -rcstring::operator[] (unsigned int i) const
226   -{
227   - check (i);
228   - return data->s[i];
229   -}
230   -
231   -rcstring::Cref rcstring::operator[](unsigned int i)
232   -{
233   - check (i);
234   - return Cref (*this, i);
235   -}
236   -
237   -
238   -unsigned int
239   -rcstring::getRefCount ()
240   -{
241   - return data->AtomicRead();;
242   -}
243   -
244   -#endif /* __RCSTRING_H__ */
examples04/07-threads2/rcstring3.h deleted 100644 → 0
1   -#ifndef __RCSTRING_H__
2   -#define __RCSTRING_H__
3   -#include <string.h>
4   -#include <stdio.h>
5   -#include <ext/atomicity.h>
6   -using namespace __gnu_cxx;
7   -#include <iostream>
8   -using namespace std;
9   -
10   -class rcstring
11   -{
12   - struct rctext;
13   - rctext *data;
14   -public:
15   - class Range
16   - {
17   - };
18   - class Cref;
19   - rcstring ();
20   - rcstring (const char *);
21   - rcstring (const rcstring &);
22   - ~rcstring ();
23   - rcstring & operator= (const char *);
24   - rcstring & operator= (const rcstring &);
25   - rcstring & operator+= (const rcstring &);
26   - rcstring operator+ (const rcstring &) const;
27   - friend ostream & operator<< (ostream &, const rcstring &);
28   - void check (unsigned int i) const;
29   - char read (unsigned int i) const;
30   - void write (unsigned int i, char c);
31   - char operator[] (unsigned int i) const;
32   - Cref operator[] (unsigned int i);
33   - unsigned int getRefCount ();
34   -};
35   -
36   -struct rcstring::rctext
37   -{
38   - char *s;
39   - unsigned int size;
40   - _Atomic_word n;
41   -
42   - rctext (unsigned int nsize, const char *p)
43   - {
44   - n = 1;
45   - size = nsize;
46   - s = new char[size + 1];
47   - strncpy (s, p, size);
48   - s[size] = '\0';
49   - };
50   - ~rctext ()
51   - {
52   - delete[]s;
53   - };
54   - unsigned int AtomicRead()
55   - {
56   - return __exchange_and_add(&n,0);
57   - };
58   -
59   - unsigned int AtomicIncrement()
60   - {
61   - return __exchange_and_add(&n,1)+1;
62   - };
63   -
64   - unsigned int AtomicDecrement()
65   - {
66   - return __exchange_and_add(&n,-1)-1;
67   - };
68   -
69   - void assign (unsigned int nsize, const char *p)
70   - {
71   - if (size != nsize)
72   - {
73   - char *ns = new char[size + 1];
74   - size = nsize;
75   - strncpy (ns, p, size);
76   - delete[]s;
77   - size = nsize;
78   - s = ns;
79   - }
80   - else
81   - strncpy (s, p, size);
82   - s[size] = '\0';
83   - }
84   -
85   -private:
86   - rctext (const rctext &);
87   - rctext & operator= (const rctext &);
88   -};
89   -
90   -class
91   - rcstring::Cref
92   -{
93   - friend class rcstring;
94   - rcstring & s;
95   - int i;
96   - Cref (rcstring & ss, unsigned int ii): s (ss), i (ii) {};
97   -public:
98   - operator char () const
99   - {
100   - return s.read (i);
101   - }
102   - rcstring::Cref &
103   - operator = (char c)
104   - {
105   - s.write (i, c);
106   - return *this;
107   - };
108   - rcstring::Cref & operator = (const Cref & ref)
109   - {
110   - return operator= ((char) ref);
111   - };
112   -};
113   -inline
114   -rcstring::rcstring ()
115   -{
116   - data = new rctext (0, "");
117   -}
118   -
119   -inline
120   -rcstring::rcstring (const rcstring & x)
121   -{
122   - x.data->AtomicIncrement();
123   - data = x.data;
124   -}
125   -
126   -inline
127   -rcstring::~rcstring ()
128   -{
129   - if(data->AtomicDecrement()==0)
130   - delete data;
131   -}
132   -
133   -rcstring & rcstring::operator= (const rcstring & x)
134   -{
135   - rctext* olddata=data;
136   - x.data->AtomicIncrement();
137   - data = x.data;
138   - if(olddata->AtomicDecrement()==0)
139   - delete olddata;
140   - return *this;
141   -}
142   -
143   -rcstring::rcstring (const char *s)
144   -{
145   - data = new rctext (strlen (s), s);
146   -}
147   -
148   -rcstring & rcstring::operator= (const char *s)
149   -{
150   - if (data->AtomicRead() == 1)
151   - data->assign (strlen (s), s);
152   - else
153   - {
154   - rctext* olddata=data;
155   - data = new rctext (strlen (s), s);
156   - if(olddata->AtomicDecrement()==0)
157   - delete olddata;
158   - };
159   - return *this;
160   -}
161   -
162   -ostream & operator << (ostream & o, const rcstring & s)
163   -{
164   - return o << s.data->s;
165   -}
166   -
167   -rcstring & rcstring::operator+= (const rcstring & s)
168   -{
169   - int newsize = data->size + s.data->size;
170   - rctext * newdata = new rctext (newsize, data->s);
171   - strcat (newdata->s, s.data->s);
172   - rctext* olddata=data;
173   - data=newdata;
174   - if(olddata->AtomicDecrement()==0)
175   - delete olddata;
176   - return *this;
177   -}
178   -
179   -rcstring
180   -rcstring::operator+ (const rcstring & s) const
181   -{
182   - return rcstring (*this) += s;
183   -}
184   -
185   -inline void
186   -rcstring::check (unsigned int i) const
187   -{
188   - if (data->size <= i)
189   - throw Range ();
190   -}
191   -
192   -inline char
193   -rcstring::read (unsigned int i) const
194   -{
195   - return data->s[i];
196   -}
197   -
198   -inline void
199   -rcstring::write (unsigned int i, char c)
200   -{
201   - if (data->AtomicRead() > 1)
202   - {
203   - rctext* newdata=new rctext(data->size,data->s);
204   - rctext* olddata=data;
205   - data=newdata;
206   - if(olddata->AtomicDecrement() == 0)
207   - delete olddata;
208   - }
209   - data->s[i] = c;
210   -}
211   -
212   -char
213   -rcstring::operator[] (unsigned int i) const
214   -{
215   - check (i);
216   - return data->s[i];
217   -}
218   -
219   -rcstring::Cref rcstring::operator[](unsigned int i)
220   -{
221   - check (i);
222   - return Cref (*this, i);
223   -}
224   -
225   -
226   -unsigned int
227   -rcstring::getRefCount ()
228   -{
229   - return data->AtomicRead();;
230   -}
231   -
232   -#endif /* __RCSTRING_H__ */
examples04/07-threads2/threads1.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include "rcstring1.h"
3   -
4   -
5   -rcstring s ("ala");
6   -
7   -void *
8   -thread1 (void *p)
9   -{
10   - int *pp = (int *) p;
11   - printf ("Parameter of thread1: %d\n", *pp);
12   - *pp = 1;
13   - for (unsigned int i = 0; i < 100000; i++)
14   - {
15   - rcstring s1 (s);
16   - }
17   - pthread_exit (p);
18   -}
19   -
20   -void *
21   -thread2 (void *p)
22   -{
23   - int *pp = (int *) p;
24   - printf ("Parameter of thread2: %d\n", *pp);
25   - *pp = 2;
26   - for (unsigned int i = 0; i < 100000; i++)
27   - {
28   - rcstring s1 (s);
29   - }
30   - pthread_exit (p);
31   -}
32   -
33   -
34   -int
35   -main ()
36   -{
37   - pthread_t t1;
38   - pthread_t t2;
39   - int *retval1;
40   - int *retval2;
41   - int r1 = 10, r2 = 11;
42   -
43   -
44   - pthread_create (&t1, NULL, thread1, &r1);
45   - pthread_create (&t2, NULL, thread2, &r2);
46   -
47   - pthread_join (t1, (void **) &retval1);
48   - pthread_join (t2, (void **) &retval2);
49   -
50   - printf ("%d\n", *retval1);
51   - printf ("%d\n", *retval2);
52   - printf ("RefCount=%d\n", s.getRefCount ());
53   -}
examples04/07-threads2/threads2.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include <pthread.h>
3   -#include "rcstring2.h"
4   -
5   -
6   -rcstring s ("ala");
7   -
8   -void *
9   -thread1 (void *p)
10   -{
11   - int *pp = (int *) p;
12   - printf ("Parameter of thread1: %d\n", *pp);
13   - *pp = 1;
14   - for (unsigned int i = 0; i < 100000; i++)
15   - {
16   - rcstring s1 (s);
17   - }
18   - pthread_exit (p);
19   -}
20   -
21   -void *
22   -thread2 (void *p)
23   -{
24   - int *pp = (int *) p;
25   - printf ("Parameter of thread2: %d\n", *pp);
26   - *pp = 2;
27   - for (unsigned int i = 0; i < 100000; i++)
28   - {
29   - rcstring s1 (s);
30   - }
31   - pthread_exit (p);
32   -}
33   -
34   -
35   -int
36   -main ()
37   -{
38   - pthread_t t1;
39   - pthread_t t2;
40   - int *retval1;
41   - int *retval2;
42   - int r1 = 10, r2 = 11;
43   -
44   -
45   - pthread_create (&t1, NULL, thread1, &r1);
46   - pthread_create (&t2, NULL, thread2, &r2);
47   -
48   - pthread_join (t1, (void **) &retval1);
49   - pthread_join (t2, (void **) &retval2);
50   -
51   - printf ("%d\n", *retval1);
52   - printf ("%d\n", *retval2);
53   - printf ("RefCount=%d\n", s.getRefCount ());
54   -}
examples04/07-threads2/threads3.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include <pthread.h>
3   -#include "rcstring3.h"
4   -
5   -
6   -rcstring s ("ala");
7   -
8   -void *
9   -thread1 (void *p)
10   -{
11   - int *pp = (int *) p;
12   - printf ("Parameter of thread1: %d\n", *pp);
13   - *pp = 1;
14   - for (unsigned int i = 0; i < 100000; i++)
15   - {
16   - rcstring s1 (s);
17   - }
18   - pthread_exit (p);
19   -}
20   -
21   -void *
22   -thread2 (void *p)
23   -{
24   - int *pp = (int *) p;
25   - printf ("Parameter of thread2: %d\n", *pp);
26   - *pp = 2;
27   - for (unsigned int i = 0; i < 100000; i++)
28   - {
29   - rcstring s1 (s);
30   - }
31   - pthread_exit (p);
32   -}
33   -
34   -
35   -int
36   -main ()
37   -{
38   - pthread_t t1;
39   - pthread_t t2;
40   - int *retval1;
41   - int *retval2;
42   - int r1 = 10, r2 = 11;
43   -
44   -
45   - pthread_create (&t1, NULL, thread1, &r1);
46   - pthread_create (&t2, NULL, thread2, &r2);
47   -
48   - pthread_join (t1, (void **) &retval1);
49   - pthread_join (t2, (void **) &retval2);
50   -
51   - printf ("%d\n", *retval1);
52   - printf ("%d\n", *retval2);
53   - printf ("RefCount=%d\n", s.getRefCount ());
54   -}
examples04/07-threads2/threads4.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include <string>
3   -using namespace std;
4   -
5   -
6   -string s ("ala");
7   -
8   -void *
9   -thread1 (void *p)
10   -{
11   - int *pp = (int *) p;
12   - printf ("Parameter of thread1: %d\n", *pp);
13   - *pp = 1;
14   - for (unsigned int i = 0; i < 100000; i++)
15   - {
16   - string s1 (s);
17   - }
18   - pthread_exit (p);
19   -}
20   -
21   -void *
22   -thread2 (void *p)
23   -{
24   - int *pp = (int *) p;
25   - printf ("Parameter of thread2: %d\n", *pp);
26   - *pp = 2;
27   - for (unsigned int i = 0; i < 100000; i++)
28   - {
29   - string s1 (s);
30   - }
31   - pthread_exit (p);
32   -}
33   -
34   -
35   -int
36   -main ()
37   -{
38   - pthread_t t1;
39   - pthread_t t2;
40   - int *retval1;
41   - int *retval2;
42   - int r1 = 10, r2 = 11;
43   -
44   -
45   - pthread_create (&t1, NULL, thread1, &r1);
46   - pthread_create (&t2, NULL, thread2, &r2);
47   -
48   - pthread_join (t1, (void **) &retval1);
49   - pthread_join (t2, (void **) &retval2);
50   -
51   - printf ("%d\n", *retval1);
52   - printf ("%d\n", *retval2);
53   -}
examples04/07-threads2/threads5.cpp deleted 100644 → 0
1   -#include <stdio.h>
2   -#include "mystring.h"
3   -
4   -string s ("ala");
5   -
6   -void *
7   -thread1 (void *p)
8   -{
9   - int *pp = (int *) p;
10   - printf ("Parameter of thread1: %d\n", *pp);
11   - *pp = 1;
12   - for (unsigned int i = 0; i < 100000; i++)
13   - {
14   - string s1 (s);
15   - }
16   - pthread_exit (p);
17   -}
18   -
19   -void *
20   -thread2 (void *p)
21   -{
22   - int *pp = (int *) p;
23   - printf ("Parameter of thread2: %d\n", *pp);
24   - *pp = 2;
25   - for (unsigned int i = 0; i < 100000; i++)
26   - {
27   - string s1 (s);
28   - }
29   - pthread_exit (p);
30   -}
31   -
32   -
33   -int
34   -main ()
35   -{
36   - pthread_t t1;
37   - pthread_t t2;
38   - int *retval1;
39   - int *retval2;
40   - int r1 = 10, r2 = 11;
41   -
42   -
43   - pthread_create (&t1, NULL, thread1, &r1);
44   - pthread_create (&t2, NULL, thread2, &r2);
45   -
46   - pthread_join (t1, (void **) &retval1);
47   - pthread_join (t2, (void **) &retval2);
48   -
49   - printf ("%d\n", *retval1);
50   - printf ("%d\n", *retval2);
51   -}
examples04/08-threads2_cxx11/makefile renamed to examples04/07-threads2_cxx11/makefile
examples04/07-threads2/mystring.h renamed to examples04/07-threads2_cxx11/mystring.h
examples04/07-threads2/rcstring1.h renamed to examples04/07-threads2_cxx11/rcstring1.h
... ... @@ -16,7 +16,6 @@ rcstring();
16 16 rcstring(const char*);
17 17 rcstring(const rcstring&);
18 18 ~rcstring();
19   -rcstring& operator=(const char*);
20 19 rcstring& operator=(const rcstring&);
21 20 rcstring& operator+=(const rcstring &);
22 21 rcstring operator+(const rcstring &) const;
... ... @@ -55,21 +54,6 @@ struct rcstring::rctext
55 54 n--;
56 55 return t;
57 56 };
58   - void assign(unsigned int nsize, const char *p)
59   - {
60   - if(size!=nsize)
61   - {
62   - char* ns=new char[size+1];
63   - size = nsize;
64   - strncpy(ns,p,size);
65   - delete [] s;
66   - size = nsize;
67   - s = ns;
68   - }
69   - else
70   - strncpy(s,p,size);
71   - s[size]='\0';
72   - }
73 57 private:
74 58 rctext(const rctext&);
75 59 rctext& operator=(const rctext&);
... ... @@ -128,19 +112,6 @@ rcstring::rcstring(const char* s)
128 112 data=new rctext(strlen(s),s);
129 113 }
130 114  
131   -rcstring& rcstring::operator=(const char* s)
132   -{
133   - if(data->n==1)
134   - data->assign(strlen(s),s);
135   - else
136   - {
137   - rctext* t = new rctext(strlen(s),s);
138   - data->n--;
139   - data= t;
140   - };
141   - return *this;
142   -}
143   -
144 115 ostream& operator << (ostream& o, const rcstring& s)
145 116 {
146 117 return o<<s.data->s;
... ...
examples04/08-threads2_cxx11/rcstring2.h renamed to examples04/07-threads2_cxx11/rcstring2.h
... ... @@ -19,7 +19,6 @@ public:
19 19 rcstring (const char *);
20 20 rcstring (const rcstring &);
21 21 ~rcstring ();
22   - rcstring & operator= (const char *);
23 22 rcstring & operator= (const rcstring &);
24 23 rcstring & operator+= (const rcstring &);
25 24 rcstring operator+ (const rcstring &) const;
... ... @@ -76,22 +75,6 @@ struct rcstring::rctext
76 75 return retval;
77 76 };
78 77  
79   - void assign (unsigned int nsize, const char *p)
80   - {
81   - if (size != nsize)
82   - {
83   - char *ns = new char[size + 1];
84   - size = nsize;
85   - strncpy (ns, p, size);
86   - delete[]s;
87   - size = nsize;
88   - s = ns;
89   - }
90   - else
91   - strncpy (s, p, size);
92   - s[size] = '\0';
93   - }
94   -
95 78 private:
96 79 rctext (const rctext &);
97 80 rctext & operator= (const rctext &);
... ... @@ -155,20 +138,6 @@ rcstring::rcstring (const char *s)
155 138 data = new rctext (strlen (s), s);
156 139 }
157 140  
158   -rcstring & rcstring::operator= (const char *s)
159   -{
160   - if (data->AtomicRead() == 1)
161   - data->assign (strlen (s), s);
162   - else
163   - {
164   - rctext* olddata=data;
165   - data = new rctext (strlen (s), s);
166   - if(olddata->AtomicDecrement()==0)
167   - delete olddata;
168   - };
169   - return *this;
170   -}
171   -
172 141 ostream & operator << (ostream & o, const rcstring & s)
173 142 {
174 143 return o << s.data->s;
... ...
examples04/08-threads2_cxx11/rcstring3.h renamed to examples04/07-threads2_cxx11/rcstring3.h
... ... @@ -19,7 +19,6 @@ public:
19 19 rcstring (const char *);
20 20 rcstring (const rcstring &);
21 21 ~rcstring ();
22   - rcstring & operator= (const char *);
23 22 rcstring & operator= (const rcstring &);
24 23 rcstring & operator+= (const rcstring &);
25 24 rcstring operator+ (const rcstring &) const;
... ... @@ -65,22 +64,6 @@ struct rcstring::rctext
65 64 return --n;
66 65 };
67 66  
68   - void assign (unsigned int nsize, const char *p)
69   - {
70   - if (size != nsize)
71   - {
72   - char *ns = new char[size + 1];
73   - size = nsize;
74   - strncpy (ns, p, size);
75   - delete[]s;
76   - size = nsize;
77   - s = ns;
78   - }
79   - else
80   - strncpy (s, p, size);
81   - s[size] = '\0';
82   - }
83   -
84 67 private:
85 68 rctext (const rctext &);
86 69 rctext & operator= (const rctext &);
... ... @@ -144,20 +127,6 @@ rcstring::rcstring (const char *s)
144 127 data = new rctext (strlen (s), s);
145 128 }
146 129  
147   -rcstring & rcstring::operator= (const char *s)
148   -{
149   - if (data->AtomicRead() == 1)
150   - data->assign (strlen (s), s);
151   - else
152   - {
153   - rctext* olddata=data;
154   - data = new rctext (strlen (s), s);
155   - if(olddata->AtomicDecrement()==0)
156   - delete olddata;
157   - };
158   - return *this;
159   -}
160   -
161 130 ostream & operator << (ostream & o, const rcstring & s)
162 131 {
163 132 return o << s.data->s;
... ...
examples04/08-threads2_cxx11/threads1.cpp renamed to examples04/07-threads2_cxx11/threads1.cpp
examples04/08-threads2_cxx11/threads2.cpp renamed to examples04/07-threads2_cxx11/threads2.cpp
examples04/08-threads2_cxx11/threads3.cpp renamed to examples04/07-threads2_cxx11/threads3.cpp
examples04/08-threads2_cxx11/threads4.cpp renamed to examples04/07-threads2_cxx11/threads4.cpp
examples04/08-threads2_cxx11/threads5.cpp renamed to examples04/07-threads2_cxx11/threads5.cpp
examples04/08-threads2_cxx11/mystring.h deleted 100644 → 0
1   -#ifndef __MYSTRING_H__
2   -#define __MYSTRING_H__
3   -
4   -#include <string.h>
5   -#include <iostream>
6   -
7   -class string
8   -{
9   - char *data;
10   - unsigned len;
11   -public:
12   - string ():data (0), len(0)
13   - {
14   - };
15   - ~string ()
16   - {
17   - delete[]data;
18   - };
19   - string (const char *s)
20   - {
21   - if (s)
22   - {
23   - len=strlen(s);
24   - data = new char[len + 1];
25   - strcpy (data, s);
26   - }
27   - else
28   - {
29   - data = 0;
30   - len = 0;
31   - }
32   - };
33   -
34   - string (const string & src)
35   - {
36   - if (src.data)
37   - {
38   - data = new char[src.len + 1];
39   - len = src.len;
40   - strcpy (data, src.data);
41   - }
42   - else
43   - {
44   - data = 0;
45   - len = 0;
46   - }
47   - };
48   - string & operator= (const string & src)
49   - {
50   - if (this != &src)
51   - {
52   - delete[]data;
53   - if (src.data)
54   - {
55   - data = new char[src.len + 1];
56   - strcpy (data, src.data);
57   - }
58   - else
59   - {
60   - data = 0;
61   - len = 0;
62   - }
63   - };
64   - return *this;
65   - }
66   -};
67   -
68   -
69   -#endif /* __string_H__ */
examples04/08-threads2_cxx11/rcstring1.h deleted 100644 → 0
1   -#ifndef __RCSTRING_H__
2   -#define __RCSTRING_H__
3   -#include <string.h>
4   -#include <stdio.h>
5   -#include <malloc.h>
6   -#include <iostream>
7   -using namespace std;
8   -
9   -class rcstring{
10   - struct rctext;
11   - rctext* data;
12   -public:
13   -class Range{};
14   -class Cref;
15   -rcstring();
16   -rcstring(const char*);
17   -rcstring(const rcstring&);
18   -~rcstring();
19   -rcstring& operator=(const char*);
20   -rcstring& operator=(const rcstring&);
21   -rcstring& operator+=(const rcstring &);
22   -rcstring operator+(const rcstring &) const;
23   -friend ostream& operator<<(ostream&, const rcstring&);
24   -void check (unsigned int i) const;
25   -char read(unsigned int i) const;
26   -void write(unsigned int i, char c);
27   -char operator[](unsigned int i) const;
28   -Cref operator[](unsigned int i);
29   -unsigned int getRefCount();
30   -};
31   -
32   -struct rcstring::rctext
33   -{
34   - char* s;
35   - unsigned int size;
36   - volatile unsigned int n;
37   -
38   - rctext(unsigned int nsize, const char* p)
39   - {
40   - n=1;
41   - size=nsize;
42   - s=new char[size+1];
43   - strncpy(s,p,size);
44   - s[size]='\0';
45   - };
46   - ~rctext()
47   - {
48   - delete [] s;
49   - };
50   - rctext* detach()
51   - {
52   - if(n==1)
53   - return this;
54   - rctext* t=new rctext(size, s);
55   - n--;
56   - return t;
57   - };
58   - void assign(unsigned int nsize, const char *p)
59   - {
60   - if(size!=nsize)
61   - {
62   - char* ns=new char[size+1];
63   - size = nsize;
64   - strncpy(ns,p,size);
65   - delete [] s;
66   - size = nsize;
67   - s = ns;
68   - }
69   - else
70   - strncpy(s,p,size);
71   - s[size]='\0';
72   - }
73   -private:
74   - rctext(const rctext&);
75   - rctext& operator=(const rctext&);
76   -};
77   -
78   -class rcstring::Cref
79   -{
80   - friend class rcstring;
81   - rcstring& s;
82   - int i;
83   - Cref (rcstring& ss, unsigned int ii): s(ss), i(ii) {};
84   -public:
85   - operator char() const
86   - {
87   - cout << "operator char() const"<<endl;
88   - return s.read(i);
89   - }
90   - rcstring::Cref& operator = (char c)
91   - {
92   - cout << "void operator = (char c)"<<endl;
93   - s.write(i,c);
94   - return *this;
95   - };
96   - rcstring::Cref& operator = (const Cref& ref)
97   - {
98   - return operator= ((char)ref);
99   - };
100   -};
101   -inline rcstring::rcstring()
102   - {
103   - data = new rctext(0,"");
104   - }
105   -
106   -inline rcstring::rcstring(const rcstring& x)
107   - {
108   - x.data->n++;
109   - data=x.data;
110   - }
111   -inline rcstring::~rcstring()
112   -{
113   - if(--data->n==0)
114   - delete data;
115   -}
116   -
117   -rcstring& rcstring::operator=(const rcstring & x)
118   -{
119   - x.data->n++;
120   - if(--data->n == 0)
121   - delete data;
122   - data=x.data;
123   - return *this;
124   -}
125   -
126   -rcstring::rcstring(const char* s)
127   -{
128   - data=new rctext(strlen(s),s);
129   -}
130   -
131   -rcstring& rcstring::operator=(const char* s)
132   -{
133   - if(data->n==1)
134   - data->assign(strlen(s),s);
135   - else
136   - {
137   - rctext* t = new rctext(strlen(s),s);
138   - data->n--;
139   - data= t;
140   - };
141   - return *this;
142   -}
143   -
144   -ostream& operator << (ostream& o, const rcstring& s)
145   -{
146   - return o<<s.data->s;
147   -}
148   -
149   -rcstring& rcstring::operator+=(const rcstring & s)
150   -{
151   -int newsize=data->size+s.data->size;
152   -rctext *newdata=new rctext(newsize,data->s);
153   -strcat(newdata->s,s.data->s);
154   -if(--data->n==0)
155   - delete data;
156   -data = newdata;
157   -return *this;
158   -}
159   -
160   -rcstring rcstring::operator+(const rcstring & s) const
161   -{
162   - return rcstring(*this)+=s;
163   -}
164   -
165   -inline void rcstring::check (unsigned int i) const
166   -{
167   -if(data->size<=i)
168   - throw Range();
169   -}
170   -inline char rcstring::read(unsigned int i) const
171   -{
172   - return data->s[i];
173   -}
174   -inline void rcstring::write(unsigned int i, char c)
175   -{
176   - data = data->detach();
177   - data->s[i] = c;
178   -}
179   -
180   -char rcstring::operator[](unsigned int i) const
181   -{
182   - cout << "char rcstring::operator[](unsigned int i) const"<<endl;
183   - check(i);
184   - return data->s[i];
185   -}
186   -
187   -rcstring::Cref rcstring::operator[](unsigned int i)
188   -{
189   - cout << "Cref rcstring::operator[](unsigned int i)"<<endl;
190   - check(i);
191   - return Cref(*this,i);
192   -}
193   -
194   -
195   -unsigned int
196   -rcstring::getRefCount()
197   -{
198   - return data->n;
199   -}
200   -
201   -#endif /* __RCSTRING_H__ */