Commit 2c9501c4a98b60f0cdf7b37415db544b2f8555b2
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,7 +15,6 @@ rcstring(); | ||
15 | rcstring(const char*); | 15 | rcstring(const char*); |
16 | rcstring(const rcstring&); | 16 | rcstring(const rcstring&); |
17 | ~rcstring(); | 17 | ~rcstring(); |
18 | -rcstring& operator=(const char*); | ||
19 | rcstring& operator=(const rcstring&); | 18 | rcstring& operator=(const rcstring&); |
20 | rcstring& operator+=(const rcstring &); | 19 | rcstring& operator+=(const rcstring &); |
21 | rcstring operator+(const rcstring &) const; | 20 | rcstring operator+(const rcstring &) const; |
@@ -54,20 +53,6 @@ struct rcstring::rctext | @@ -54,20 +53,6 @@ struct rcstring::rctext | ||
54 | n--; | 53 | n--; |
55 | return t; | 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 | private: | 56 | private: |
72 | rctext(const rctext&); | 57 | rctext(const rctext&); |
73 | rctext& operator=(const rctext&); | 58 | rctext& operator=(const rctext&); |
@@ -103,19 +88,6 @@ rcstring::rcstring(const char* s) | @@ -103,19 +88,6 @@ rcstring::rcstring(const char* s) | ||
103 | data=new rctext(strlen(s),s); | 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 | ostream& operator << (ostream& o, const rcstring& s) | 91 | ostream& operator << (ostream& o, const rcstring& s) |
120 | { | 92 | { |
121 | return o<<s.data->s; | 93 | return o<<s.data->s; |
examples04/05-rcstring/rcstring.h
@@ -16,7 +16,6 @@ rcstring(); | @@ -16,7 +16,6 @@ rcstring(); | ||
16 | rcstring(const char*); | 16 | rcstring(const char*); |
17 | rcstring(const rcstring&); | 17 | rcstring(const rcstring&); |
18 | ~rcstring(); | 18 | ~rcstring(); |
19 | -rcstring& operator=(const char*); | ||
20 | rcstring& operator=(const rcstring&); | 19 | rcstring& operator=(const rcstring&); |
21 | rcstring& operator+=(const rcstring &); | 20 | rcstring& operator+=(const rcstring &); |
22 | rcstring operator+(const rcstring &) const; | 21 | rcstring operator+(const rcstring &) const; |
@@ -54,20 +53,6 @@ struct rcstring::rctext | @@ -54,20 +53,6 @@ struct rcstring::rctext | ||
54 | n--; | 53 | n--; |
55 | return t; | 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 | private: | 56 | private: |
72 | rctext(const rctext&); | 57 | rctext(const rctext&); |
73 | rctext& operator=(const rctext&); | 58 | rctext& operator=(const rctext&); |
@@ -126,19 +111,6 @@ rcstring::rcstring(const char* s) | @@ -126,19 +111,6 @@ rcstring::rcstring(const char* s) | ||
126 | data=new rctext(strlen(s),s); | 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 | ostream& operator << (ostream& o, const rcstring& s) | 114 | ostream& operator << (ostream& o, const rcstring& s) |
143 | { | 115 | { |
144 | return o<<s.data->s; | 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 | threads1: threads1.o | 3 | threads1: threads1.o |
4 | g++ -g $^ -lpthread -o$@ | 4 | g++ -g $^ -lpthread -o$@ |
@@ -6,12 +6,6 @@ threads1: threads1.o | @@ -6,12 +6,6 @@ threads1: threads1.o | ||
6 | threads1.o: threads1.cpp | 6 | threads1.o: threads1.cpp |
7 | g++ -g -c -Wall -pedantic $< -o $@ | 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 | threads1_cxx11: threads1_cxx11.cpp | 9 | threads1_cxx11: threads1_cxx11.cpp |
16 | g++ -g -std=c++11 -pthread -Wall -pedantic $< -o $@ | 10 | g++ -g -std=c++11 -pthread -Wall -pedantic $< -o $@ |
17 | 11 | ||
@@ -30,27 +24,8 @@ volatile2_cxx11: volatile2_cxx11.cpp | @@ -30,27 +24,8 @@ volatile2_cxx11: volatile2_cxx11.cpp | ||
30 | volatile2_cxx11.s: volatile2_cxx11.cpp | 24 | volatile2_cxx11.s: volatile2_cxx11.cpp |
31 | g++ -g -std=c++11 -pthread -Wall -pedantic -S -O2 $< -o $@ | 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 | .PHONY: clean | 28 | .PHONY: clean |
54 | 29 | ||
55 | clean: | 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,7 +16,6 @@ rcstring(); | ||
16 | rcstring(const char*); | 16 | rcstring(const char*); |
17 | rcstring(const rcstring&); | 17 | rcstring(const rcstring&); |
18 | ~rcstring(); | 18 | ~rcstring(); |
19 | -rcstring& operator=(const char*); | ||
20 | rcstring& operator=(const rcstring&); | 19 | rcstring& operator=(const rcstring&); |
21 | rcstring& operator+=(const rcstring &); | 20 | rcstring& operator+=(const rcstring &); |
22 | rcstring operator+(const rcstring &) const; | 21 | rcstring operator+(const rcstring &) const; |
@@ -55,21 +54,6 @@ struct rcstring::rctext | @@ -55,21 +54,6 @@ struct rcstring::rctext | ||
55 | n--; | 54 | n--; |
56 | return t; | 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 | private: | 57 | private: |
74 | rctext(const rctext&); | 58 | rctext(const rctext&); |
75 | rctext& operator=(const rctext&); | 59 | rctext& operator=(const rctext&); |
@@ -129,19 +113,6 @@ rcstring::rcstring(const char* s) | @@ -129,19 +113,6 @@ rcstring::rcstring(const char* s) | ||
129 | data=new rctext(strlen(s),s); | 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 | ostream& operator << (ostream& o, const rcstring& s) | 116 | ostream& operator << (ostream& o, const rcstring& s) |
146 | { | 117 | { |
147 | return o<<s.data->s; | 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,7 +16,6 @@ rcstring(); | ||
16 | rcstring(const char*); | 16 | rcstring(const char*); |
17 | rcstring(const rcstring&); | 17 | rcstring(const rcstring&); |
18 | ~rcstring(); | 18 | ~rcstring(); |
19 | -rcstring& operator=(const char*); | ||
20 | rcstring& operator=(const rcstring&); | 19 | rcstring& operator=(const rcstring&); |
21 | rcstring& operator+=(const rcstring &); | 20 | rcstring& operator+=(const rcstring &); |
22 | rcstring operator+(const rcstring &) const; | 21 | rcstring operator+(const rcstring &) const; |
@@ -55,21 +54,6 @@ struct rcstring::rctext | @@ -55,21 +54,6 @@ struct rcstring::rctext | ||
55 | n--; | 54 | n--; |
56 | return t; | 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 | private: | 57 | private: |
74 | rctext(const rctext&); | 58 | rctext(const rctext&); |
75 | rctext& operator=(const rctext&); | 59 | rctext& operator=(const rctext&); |
@@ -128,19 +112,6 @@ rcstring::rcstring(const char* s) | @@ -128,19 +112,6 @@ rcstring::rcstring(const char* s) | ||
128 | data=new rctext(strlen(s),s); | 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 | ostream& operator << (ostream& o, const rcstring& s) | 115 | ostream& operator << (ostream& o, const rcstring& s) |
145 | { | 116 | { |
146 | return o<<s.data->s; | 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,7 +19,6 @@ public: | ||
19 | rcstring (const char *); | 19 | rcstring (const char *); |
20 | rcstring (const rcstring &); | 20 | rcstring (const rcstring &); |
21 | ~rcstring (); | 21 | ~rcstring (); |
22 | - rcstring & operator= (const char *); | ||
23 | rcstring & operator= (const rcstring &); | 22 | rcstring & operator= (const rcstring &); |
24 | rcstring & operator+= (const rcstring &); | 23 | rcstring & operator+= (const rcstring &); |
25 | rcstring operator+ (const rcstring &) const; | 24 | rcstring operator+ (const rcstring &) const; |
@@ -76,22 +75,6 @@ struct rcstring::rctext | @@ -76,22 +75,6 @@ struct rcstring::rctext | ||
76 | return retval; | 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 | private: | 78 | private: |
96 | rctext (const rctext &); | 79 | rctext (const rctext &); |
97 | rctext & operator= (const rctext &); | 80 | rctext & operator= (const rctext &); |
@@ -155,20 +138,6 @@ rcstring::rcstring (const char *s) | @@ -155,20 +138,6 @@ rcstring::rcstring (const char *s) | ||
155 | data = new rctext (strlen (s), s); | 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 | ostream & operator << (ostream & o, const rcstring & s) | 141 | ostream & operator << (ostream & o, const rcstring & s) |
173 | { | 142 | { |
174 | return o << s.data->s; | 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,7 +19,6 @@ public: | ||
19 | rcstring (const char *); | 19 | rcstring (const char *); |
20 | rcstring (const rcstring &); | 20 | rcstring (const rcstring &); |
21 | ~rcstring (); | 21 | ~rcstring (); |
22 | - rcstring & operator= (const char *); | ||
23 | rcstring & operator= (const rcstring &); | 22 | rcstring & operator= (const rcstring &); |
24 | rcstring & operator+= (const rcstring &); | 23 | rcstring & operator+= (const rcstring &); |
25 | rcstring operator+ (const rcstring &) const; | 24 | rcstring operator+ (const rcstring &) const; |
@@ -65,22 +64,6 @@ struct rcstring::rctext | @@ -65,22 +64,6 @@ struct rcstring::rctext | ||
65 | return --n; | 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 | private: | 67 | private: |
85 | rctext (const rctext &); | 68 | rctext (const rctext &); |
86 | rctext & operator= (const rctext &); | 69 | rctext & operator= (const rctext &); |
@@ -144,20 +127,6 @@ rcstring::rcstring (const char *s) | @@ -144,20 +127,6 @@ rcstring::rcstring (const char *s) | ||
144 | data = new rctext (strlen (s), s); | 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 | ostream & operator << (ostream & o, const rcstring & s) | 130 | ostream & operator << (ostream & o, const rcstring & s) |
162 | { | 131 | { |
163 | return o << s.data->s; | 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__ */ |