Plan 9 from Bell Labs’s /usr/web/sources/contrib/steve/root/sys/include/c++/str_imp.h

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


/*ident	"@(#) @(#)str_imp.h	1.1.1.2" */
/******************************************************************************
*
* C++ Standard Library
*
* Copyright (c) 1996  Lucent Technologies.  All Rights Reserved.
*
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF Lucent Technologies.
* The copyright notice above does not evidence any actual or
* intended publication of such source code.
*
******************************************************************************/

#ifndef STDSTRINGH 
#define STDSTRINGH

#include "compiler_type.h"
#include <string.h>
#if !defined(COMPILER_IS_PC_LUCENT)
#include <sysent.h>
#endif

#include <stdio.h>
#include <memory.h>
#include <ctype.h>
#if defined(CFRONT_COMPATIBLE_LUCENT)
typedef char *reverse_iterator;
typedef const char *const_reverse_iterator;
#include "std_bool.h"
#else
#include <iterator.h>
#endif

class ostream;
class istream;

#ifdef NAMESPACES_LUCENT
namespace std {
#endif
class Pool_std;

struct string_char_traits_LUCENT {
	typedef char char_type;
	typedef istream istream_type;
	typedef ostream ostream_type;
	static void assign(char& c1, const char &c2) { c1 = c2; }
	static bool eq(const char &c1, const char &c2) { return (c1 == c2); }
	static bool ne(const char &c1, const char &c2) { return (c1 != c2); }
	static bool lt(const char &c1, const char &c2) { return (c1 < c2); }
	static char eos() { return (char)0; }
//	static istream &char_in(istream &is, char &a) { return (is >> a); }
//	static ostream &char_out(ostream &os, char a) { return (os << a); }
	static bool is_del(char a) { return (isspace(a)); }
	static int compare(const char *s1, const char *s2, size_t n) {
		return (strncmp(s1, s2, n)); }
	static size_t length(const char *s) { return (strlen(s)); }
	static char *copy(char *s1, const char *s2, size_t n) {
		return (strncpy(s1, s2, n)); }
	static char *move(char *s1, const char *s2, int n) {
		return (strncpy(s1, s2, n)); }
};

class string {		//  the string
public:
	class Srep_LUCENT {         // String Representation
	public:
	    enum { MAXS = 8, MAXL = 64 };
	    static Srep_LUCENT* nullrep_; // nullrep always has refc == 0 and max_size == 0
	    static Pool_std* Reelp;  // Pool for "reel" small strings
	    static Pool_std* SPoolp; // Pool for smallish strings
	    static void initialize() { if (Reelp == 0) doinitialize(); }
	    static void doinitialize();
	    static Srep_LUCENT* nullrep() { initialize(); return nullrep_; }
	    static Srep_LUCENT *new_srep(size_t);
	    static Srep_LUCENT *get_long(size_t);
	    size_t len;
	    size_t max_size;
	    size_t refc;
	    char str[MAXS];
	    Srep_LUCENT() { len = 0; max_size = 0; refc = 0; }
	    void rcdec() { if(refc && --refc==0)  delete_srep(); }
	    void rcinc() { if(refc) refc++; }
	    void delete_srep();
	};

public:
	typedef	string_char_traits_LUCENT traits_type;
	typedef	string_char_traits_LUCENT::char_type value_type;
	typedef size_t size_type;
	typedef ptrdiff_t difference_type;
	typedef char &reference;
	typedef const char &const_reference;
	typedef char *pointer;
	typedef const char *const_pointer;
	typedef char *iterator;
	typedef const char *const_iterator;
#if !defined(CFRONT_COMPATIBLE_LUCENT)
	typedef reverse_iterator<const_iterator, value_type,
		const_reference, difference_type> const_reverse_iterator;
	typedef reverse_iterator<iterator, value_type,
		reference, difference_type> reverse_iterator;
#else
	typedef char *reverse_iterator;
	typedef const char *const_reverse_iterator;
#endif

	static const size_t npos;

	/* constructors and destructor */
	string() { d = Srep_LUCENT::nullrep(); }
	string(const string& s, size_t = 0, size_t = npos);
	string(const char*, size_t);
	string(const char*);
	string(size_t, char);
	//template <class InputIterator> string(InputIterator, InputIterator);
	~string() { d->rcdec(); }

	/* assignment */
	inline string& operator=(const string&);
	string& operator=(const char*);
	inline string& operator=(char);
	
	/* iterators */
	iterator begin();
	const_iterator begin() const;
	iterator end();
	const_iterator end() const;
	reverse_iterator rbegin();
	const_reverse_iterator rbegin() const;
	reverse_iterator rend();
	const_reverse_iterator rend() const;

	size_t length() const { return d->len; } 
	size_t size() const { return d->len; }
	size_t max_size() const { return d->max_size; } 
	void resize(size_t, char = '\0');
	size_t capacity() const { return d->max_size; }
	void reserve(size_t n) {
		if (n >= d->max_size) reserve_grow(n);
	}

	bool empty() const { return d->len ? 0 : 1; } 

	inline char operator[](size_t) const;
	char& operator[](size_t);
	inline const char& at(size_t) const;
	char& at(size_t);

	/* concatenation */
	string& operator+=(const string&);
	string& operator+=(const char*);
	inline string& operator+=(char);
	string& append(const string &, size_t pos = 0, size_t n = npos);
	string& append(const char*, size_t len);
	string& append(const char*);
	string& append(size_t, char = '\0');
	//template <class InputIterator> string& append(InputIterator, InputIterator);

	string& assign(const string &, size_t pos = 0, size_t n = npos);
	string& assign(const char *, size_t);
	string& assign(const char *);
	string& assign(size_t, char = '\0');
	//template <class InputIterator> string& assign(InputIterator, InputIterator);
	
	string& insert(size_t, const string &, size_t = 0, size_t = npos);
	string& insert(size_t, const char *, size_t);
	string& insert(size_t, const char *);
	string& insert(size_t, size_t, char = '\0');
	iterator insert(iterator, char = '\0');
	iterator insert(iterator, size_t, char = '\0');
	//template <class InputIterator> void insert(iterator, InputIterator, InputIterator);
	
	string& remove(size_t pos = 0, size_t n = npos);
	string& remove(iterator);
	string& remove(iterator, iterator);


	string& replace(size_t, size_t, const string &, size_t = 0, size_t = npos);
	string& replace(size_t, size_t, const char *, size_t);
	string& replace(size_t, size_t, const char *);
	string& replace(size_t, size_t, char);
	string& replace(iterator, iterator, const string &);
	string& replace(iterator, iterator, const char *, size_t);
	string& replace(iterator, iterator, const char *);
	string& replace(iterator, iterator, char);
	//template <class InputIterator> string& replace(iterator, iterator, InputIterator, InputIterator);
	
	size_t copy(char *, size_t, size_t = 0);
	void swap(string &);
	inline const char *c_str() const;
	inline const char *data() const;
	
	/* find functions */
	size_t find(const string &, size_t = 0) const;
	size_t find(const char *, size_t, size_t) const;
	size_t find(const char *, size_t = 0) const;
	size_t find(char, size_t = 0) const;
	size_t rfind(const string &, size_t = npos) const;
	size_t rfind(const char *, size_t, size_t) const;
	size_t rfind(const char *, size_t = npos) const;
	size_t rfind(char, size_t = npos) const;
	size_t find_first_of(const string &, size_t = 0) const;
	size_t find_first_of(const char *, size_t, size_t) const;
	size_t find_first_of(const char *, size_t = 0) const;
	size_t find_first_of(char, size_t = 0) const;
	size_t find_last_of(const string &, size_t = npos) const;
	size_t find_last_of(const char *, size_t, size_t) const;
	size_t find_last_of(const char *, size_t = npos) const;
	size_t find_last_of(char, size_t = npos) const;
	size_t find_first_not_of(const string &, size_t = 0) const;
	size_t find_first_not_of(const char *, size_t, size_t) const;
	size_t find_first_not_of(const char *, size_t = 0) const;
	size_t find_first_not_of(char, size_t = 0) const;
	size_t find_last_not_of(const string &, size_t = npos) const;
	size_t find_last_not_of(const char *, size_t, size_t) const;
	size_t find_last_not_of(const char *, size_t = npos) const;
	size_t find_last_not_of(char, size_t = npos) const;

	string substr(size_t = 0, size_t = npos) const;

	int compare(const string &, size_t = 0, size_t = npos) const;
	int compare(const char *, size_t, size_t) const;
	int compare(const char *, size_t = 0) const;
	
private:
	Srep_LUCENT *d;
	string(Srep_LUCENT* r) { d = r; }
	string& newcopy(char);
	void reserve_grow(int);
	inline void uniq();
public:
	/* ADDITION */
	friend string operator+(const string&, const string&);
	friend string operator+(const string&, const char*);
	friend string operator+(const string&, char);
	friend string operator+(const char*, const string&);
	friend string operator+(char, const string&);
	//int nrefs() const { return d->refc; }
	//const Srep_LUCENT *rep() const { return d; }
	/* COMPARISON OPERATORS */
	friend inline bool operator==(const string&, const string&);
	friend inline bool operator==(const string&, const char*);
	friend inline bool operator!=(const string&, const string&);
	friend inline bool operator!=(const string&, const char*);
	/* INPUT/OUTPUT */
	friend /*inline*/ ostream& operator<<(ostream&, const string&);
	friend istream& operator>>(istream&, string&);
	friend istream& getline(istream&, string&, char delim = '\n');

#if defined(COMPILER_IS_PC_LUCENT)
#if !defined(_MSC_VER) || _MSC_VER < 1000
private:
	static size_t length(const char *s) { return (strlen(s)); }
	static char *copy(char *s1, const char *s2, size_t n) {
		return (strncpy(s1, s2, n)); }
#endif
#endif
};


// inline functions

inline
const char *string::data() const {
	if (d->len == 0) return 0;
	else {
		if (d->len >= d->max_size && d->len)
			((string *) this)->reserve_grow(d->len + 1);
		*(d->str + d->len) = '\0'; 
		return (d->str);
	}
}
inline
const char *string::c_str() const {
	if (d->len >= d->max_size && d->len)
		((string *) this)->reserve_grow(d->len + 1);
	*(d->str + d->len) = '\0'; 
	return (d->str);
}

inline string&
string::operator=(const string& r) {
        r.d->rcinc();
        d->rcdec();
        d = r.d;
        return *this;
}

inline string&
string::operator=(char c) {
	if(d->refc!=1) {
		d->rcdec();
		d = Srep_LUCENT::new_srep(1);
	}
	d->str[0] = c;
	d->len = 1;
	return *this;
}
inline bool
operator==(const string& t, const string& s) {
	register int dlen = t.d->len;
	register bool retval;
	if ((dlen != s.d->len) || (dlen && t.d->str[0] != s.d->str[0]) || (dlen>1 && t.d->str[1] != s.d->str[1]))
		retval = 0;
	else
		retval = !memcmp(t.d->str, s.d->str, dlen);
	return retval;
}
inline bool
operator==(const string& t, const char* s) {
	register int dlen = t.d->len;
	register bool retval;
	if (!s || (dlen && t.d->str[0]!=s[0]) || (dlen>1 && s[0]!='\0' && t.d->str[1]!=s[1]))
		retval = 0;
	else
		retval = (dlen != strlen(s)) ? 0 : !memcmp(t.d->str, s, dlen);
	return retval;
}

inline bool
operator==(const char* s, const string& t) { return t==s; }

inline int
operator!=(const string& t, const string& s) {
	register int dlen = t.d->len;
	register bool retval;
	if ((dlen != s.d->len) || (dlen && t.d->str[0] != s.d->str[0]) || (dlen>1 && t.d->str[1] != s.d->str[1]))
		retval = 1;
	else
		retval = memcmp(t.d->str, s.d->str, dlen);
	return retval;
}
inline bool
operator!=(const string& t, const char* s) {
	register int dlen = t.d->len;
	register bool retval;
	if (!s || (dlen && t.d->str[0]!=s[0]) || (dlen>1 && s[0]!='\0' && t.d->str[1]!=s[1]))
		retval = 1;
	else
		retval = (dlen != strlen(s)) ? 1 : memcmp(t.d->str, s, dlen);
	return retval;
}

inline bool 
operator!=(const char* s, const string& t) { return t!=s; }
inline bool 
operator>=(const string& s, const string& t) { return s.compare(t)>=0; }
inline bool 
operator>=(const string& t, const char* s) { return t.compare(s)>=0; }
inline bool 
operator>=(const char* s, const string& t) { return t.compare(s)<=0; }
inline bool 
operator>(const string& s, const string& t) { return s.compare(t)>0; }
inline bool 
operator>(const string& t, const char* s) { return t.compare(s)>0; }
inline bool 
operator>(const char* s, const string& t) { return t.compare(s)<0; }
inline bool 
operator<=(const string& s, const string& t) { return s.compare(t)<=0; }
inline bool 
operator<=(const string& t, const char* s) { return t.compare(s)<=0; }
inline bool 
operator<=(const char* s, const string& t) { return t.compare(s)>=0; }
inline bool 
operator<(const string& s, const string& t) { return s.compare(t)<0; }
inline bool 
operator<(const string& t, const char* s) { return t.compare(s)<0; }
inline bool 
operator<(const char* s, const string& t) { return t.compare(s)>0; }

inline char
string::operator[](size_t i) const {
	return d->str[i];
}
inline const char &
string::at(size_t i) const {
	return d->str[i];
}

inline string&
string::operator+=(char c) {
	int append_to_current = 1;
	if (d->refc != 1 || d->len == d->max_size - 1)
		append_to_current = 0;
	else
		d->str[d->len++] = c;
	string &s = append_to_current ? *this : newcopy(c);
	return s;
}

inline void
string::uniq() {
	register Srep_LUCENT* x;
	if(d->refc > 1) {
		x = Srep_LUCENT::new_srep(d->len);
		memcpy(x->str, d->str, d->len);
		d->rcdec();
		d = x;
	}
}
inline string::iterator string::begin() { uniq(); return d->str; }
inline string::const_iterator string::begin() const { return d->str; }
inline string::iterator string::end() { uniq(); return d->str + d->len; }
inline string::const_iterator string::end() const { return d->str + d->len; }
inline string::reverse_iterator string::rbegin() { uniq(); return d->str + d->len; }
inline string::const_reverse_iterator string::rbegin() const { return d->str + d->len; }
inline string::reverse_iterator string::rend() { uniq(); return d->str; }
inline string::const_reverse_iterator string::rend() const { return d->str; }

#ifdef NAMESPACES_LUCENT
}
#endif

#endif

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.