Skip to content

Commit 5c4ce21

Browse files
committed
[CPP] Add std::string
1 parent a77c909 commit 5c4ce21

File tree

8 files changed

+113
-10
lines changed

8 files changed

+113
-10
lines changed

src/usr/include/iostream.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <string.h>
34

45
namespace std {
56

@@ -9,8 +10,9 @@ extern const char endl;
910
class ostream {
1011
public:
1112
ostream& operator<<(const char c);
12-
ostream& operator<<(const char* str);
1313
ostream& operator<<(const int num);
14+
ostream& operator<<(const std::string &str);
15+
ostream& operator<<(const char* str);
1416
};
1517

1618
class istream {

src/usr/include/string.h

+34-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ extern "C" {
77
namespace std {
88
#endif
99

10-
int strcmp(char *l, char *r);
11-
int strcmpi(char *l, char *r);
12-
int strlen(char *str);
10+
int strcmp(const char *l, const char *r);
11+
int strcmpi(const char *l, const char *r);
12+
int strlen(const char *str);
1313
char *strcpy(char *dest, const char *src);
1414
char *strncpy(char *dest, const char *src, size_t n);
1515
void *memcpy(void *dest, const void *src, unsigned int n);
@@ -22,3 +22,34 @@ char *strtok(char *str, const char *delim);
2222
} // namespace std end
2323
} // extern C end
2424
#endif
25+
26+
27+
#ifdef __cplusplus
28+
#include <vector.h>
29+
30+
namespace std {
31+
32+
template<typename CharT>
33+
class basic_string {
34+
std::vector<CharT> _data;
35+
36+
public:
37+
basic_string();
38+
basic_string(std::size_t n, CharT c);
39+
basic_string(const CharT* str);
40+
basic_string(const CharT* str, std::size_t n);
41+
42+
CharT& back();
43+
CharT& front();
44+
CharT& at(std::size_t pos);
45+
CharT& operator[](std::size_t pos);
46+
const CharT *c_str() const;
47+
};
48+
49+
using string = basic_string<char>;
50+
51+
} // namespace std end
52+
53+
#include <string.tcc>
54+
55+
#endif

src/usr/include/string.tcc

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#pragma once
2+
3+
// This is internal headerfile to be included by string.h only
4+
5+
#include <string.h>
6+
7+
namespace std {
8+
9+
template <typename CharT>
10+
basic_string<CharT>::basic_string() : _data(1, '\0') {}
11+
12+
template <typename CharT>
13+
basic_string<CharT>::basic_string(std::size_t n, CharT c) : _data(n+1, c) {
14+
this->_data[n] = '\0';
15+
}
16+
17+
template <typename CharT>
18+
basic_string<CharT>::basic_string(const CharT* str) : _data(std::strlen(str)+1, '\0') {
19+
for (std::size_t i = 0; i < this->_data.size(); i++) {
20+
this->_data[i] = str[i];
21+
}
22+
}
23+
24+
template <typename CharT>
25+
basic_string<CharT>::basic_string(const CharT* str, std::size_t n) {
26+
int str_n = std::strlen(str);
27+
this->_data(n+1, '\0');
28+
for (std::size_t i = 0; i < n && i < str_n; i++) {
29+
this->_data[i] = str[i];
30+
}
31+
}
32+
33+
template <typename CharT>
34+
CharT& basic_string<CharT>::back() {
35+
return this->_data.at(this->_data.size()-2);
36+
}
37+
38+
template <typename CharT>
39+
CharT& basic_string<CharT>::front() {
40+
return this->_data.at(0);
41+
}
42+
43+
template <typename CharT>
44+
CharT& basic_string<CharT>::at(std::size_t pos) {
45+
return this->_data.at(pos);
46+
}
47+
48+
template <typename CharT>
49+
CharT& basic_string<CharT>::operator[](std::size_t pos) {
50+
return this->_data[pos];
51+
}
52+
53+
template <typename CharT>
54+
const CharT *basic_string<CharT>::c_str() const {
55+
return this->_data.raw_data();
56+
}
57+
58+
} // namespace std end

src/usr/include/vector.h

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class vector {
1414
vector<T>();
1515
vector<T>(std::size_t size, const T &_default);
1616

17+
T *raw_data() const;
1718
bool empty();
1819
std::size_t size();
1920
void push_back(const T &val);

src/usr/include/vector.tcc

+6
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ void vector<T>::resize_capacity(std::size_t capacity) {
4444
this->_data = _new_data;
4545
}
4646

47+
template <typename T>
48+
T *vector<T>::raw_data() const {
49+
return this->_data;
50+
}
51+
4752
template <typename T>
4853
bool vector<T>::empty() {
4954
return this->_size == 0;
@@ -74,6 +79,7 @@ template <typename T>
7479
T &vector<T>::back() {
7580
return this->_data[this->_size-1];
7681
}
82+
7783
template <typename T>
7884
T &vector<T>::front() {
7985
return this->_data[0];

src/usr/lib/iostream.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ ostream cout;
99
istream cin;
1010

1111
ostream& ostream::operator<<(const char c) { putchar(c); return *this; }
12-
ostream& ostream::operator<<(const char *str) { puts(str); return *this; }
1312
ostream& ostream::operator<<(const int num) { printf("%d", num); return *this; }
13+
ostream& ostream::operator<<(const char *str) { puts(str); return *this; }
14+
ostream& ostream::operator<<(const std::string &str) { puts(str.c_str()); return *this; }
1415

1516
istream& istream::operator>>(char &c) { c = getch(); putchar(c); return *this; }
1617
istream& istream::operator>>(char *str) { gets(str); return *this; }

src/usr/lib/string.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#include <stddef.h>
33
#include <ctype.h>
44

5-
int strcmp(char *l, char *r) {
6-
int i=0,j=0;
5+
int strcmp(const char *l, const char *r) {
6+
int i=0, j=0;
77
while(l[i]!='\0' && r[j]!='\0') {
88
if(l[i]!=r[j]) {
99
return l[i]-r[j];
@@ -19,8 +19,8 @@ int strcmp(char *l, char *r) {
1919
return -1;
2020
}
2121

22-
int strcmpi(char *l, char *r) {
23-
int i=0,j=0;
22+
int strcmpi(const char *l, const char *r) {
23+
int i=0, j=0;
2424
while(l[i]!='\0' && r[j]!='\0') {
2525
char a = tolower(l[i]);
2626
char b = tolower(r[j]);
@@ -38,7 +38,7 @@ int strcmpi(char *l, char *r) {
3838
return -1;
3939
}
4040

41-
int strlen(char *str) {
41+
int strlen(const char *str) {
4242
int n=0;
4343
while((*str)!='\0') {
4444
n++;

src/usr/local/src/simplecpp.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ int main(int argc, char *argv[]) {
7474
std::cout << "list[" << (int)i << "] = " << list[i] << std::endl;
7575
}
7676

77+
// std::string
78+
std::string cpp_string("i am c++ string");
79+
std::cout << "Out: " << cpp_string << std::endl;
80+
7781
std::cout << "Exiting..." << std::endl;
7882
return 0;
7983
}

0 commit comments

Comments
 (0)