provide real definitions for |NS_LITERAL_STRING| (one of which exploits |wchar_t|); add a range-check assertion to |CharAt|; add another constructor to |nsPromiseConcatenation| to allow per-class |operator+()| (which some compilers need to resolve ambiguity) to work; fiddled with inlining to reduce bloat ... more experiments needed

This commit is contained in:
scc%mozilla.org 2000-06-11 01:00:08 +00:00
parent c5867168d6
commit 3adf5c9604
3 changed files with 63 additions and 9 deletions

View File

@ -133,11 +133,15 @@ class nsReadingIterator
return *get(); return *get();
} }
//#if 0
// An iterator really deserves this, but some compilers (notably IBM VisualAge for OS/2)
// don't like this when |CharT| is a type without members.
pointer pointer
operator->() const operator->() const
{ {
return get(); return get();
} }
//#endif
nsReadingIterator<CharT>& nsReadingIterator<CharT>&
operator++() operator++()
@ -534,11 +538,11 @@ basic_nsAReadableString<CharT>::Implementation() const
*/ */
template <class CharT> template <class CharT>
inline
CharT CharT
basic_nsAReadableString<CharT>::CharAt( PRUint32 aIndex ) const basic_nsAReadableString<CharT>::CharAt( PRUint32 aIndex ) const
{ {
// ??? Is |CharAt()| supposed to be the 'safe' version? NS_ASSERTION(aIndex<Length(), "|CharAt| out-of-range");
nsReadableFragment<CharT> fragment; nsReadableFragment<CharT> fragment;
return *GetReadableFragment(fragment, kFragmentAt, aIndex); return *GetReadableFragment(fragment, kFragmentAt, aIndex);
} }
@ -604,6 +608,7 @@ basic_nsAReadableString<CharT>::Mid( basic_nsAWritableString<CharT>& aResult, PR
} }
template <class CharT> template <class CharT>
inline
PRUint32 PRUint32
basic_nsAReadableString<CharT>::Left( basic_nsAWritableString<CharT>& aResult, PRUint32 aLengthToCopy ) const basic_nsAReadableString<CharT>::Left( basic_nsAWritableString<CharT>& aResult, PRUint32 aLengthToCopy ) const
{ {
@ -877,6 +882,13 @@ class nsPromiseConcatenation
mStrings[kRightString] = &aRightString; mStrings[kRightString] = &aRightString;
} }
nsPromiseConcatenation( const nsPromiseConcatenation<CharT>& aLeftString, const basic_nsAReadableString<CharT>& aRightString )
: mFragmentIdentifierMask(aLeftString.mFragmentIdentifierMask<<1)
{
mStrings[kLeftString] = &aLeftString;
mStrings[kRightString] = &aRightString;
}
virtual PRUint32 Length() const; virtual PRUint32 Length() const;
virtual PRBool Promises( const basic_nsAReadableString<CharT>& ) const; virtual PRBool Promises( const basic_nsAReadableString<CharT>& ) const;
// virtual PRBool PromisesExactly( const basic_nsAReadableString<CharT>& ) const; // virtual PRBool PromisesExactly( const basic_nsAReadableString<CharT>& ) const;
@ -1239,7 +1251,13 @@ typedef basic_nsAReadableString<char> nsAReadableCString;
typedef basic_nsLiteralString<PRUnichar> nsLiteralString; typedef basic_nsLiteralString<PRUnichar> nsLiteralString;
typedef basic_nsLiteralString<char> nsLiteralCString; typedef basic_nsLiteralString<char> nsLiteralCString;
#define NS_LITERAL_STRING(s) nsLiteralString(s, (sizeof(s)/sizeof(wchar_t))-1)
#ifdef HAVE_CPP_2BYTE_WCHAR_T
#define NS_LITERAL_STRING(s) nsLiteralString(L##s, (sizeof(L##s)/sizeof(wchar_t))-1)
#else
#define NS_LITERAL_STRING(s) NS_ConvertASCIItoUCS2(s, sizeof(s)-1)
#endif
#define NS_LITERAL_CSTRING(s) nsLiteralCString(s, sizeof(s)-1) #define NS_LITERAL_CSTRING(s) nsLiteralCString(s, sizeof(s)-1)
typedef basic_nsLiteralChar<char> nsLiteralChar; typedef basic_nsLiteralChar<char> nsLiteralChar;

View File

@ -133,11 +133,15 @@ class nsReadingIterator
return *get(); return *get();
} }
//#if 0
// An iterator really deserves this, but some compilers (notably IBM VisualAge for OS/2)
// don't like this when |CharT| is a type without members.
pointer pointer
operator->() const operator->() const
{ {
return get(); return get();
} }
//#endif
nsReadingIterator<CharT>& nsReadingIterator<CharT>&
operator++() operator++()
@ -534,11 +538,11 @@ basic_nsAReadableString<CharT>::Implementation() const
*/ */
template <class CharT> template <class CharT>
inline
CharT CharT
basic_nsAReadableString<CharT>::CharAt( PRUint32 aIndex ) const basic_nsAReadableString<CharT>::CharAt( PRUint32 aIndex ) const
{ {
// ??? Is |CharAt()| supposed to be the 'safe' version? NS_ASSERTION(aIndex<Length(), "|CharAt| out-of-range");
nsReadableFragment<CharT> fragment; nsReadableFragment<CharT> fragment;
return *GetReadableFragment(fragment, kFragmentAt, aIndex); return *GetReadableFragment(fragment, kFragmentAt, aIndex);
} }
@ -604,6 +608,7 @@ basic_nsAReadableString<CharT>::Mid( basic_nsAWritableString<CharT>& aResult, PR
} }
template <class CharT> template <class CharT>
inline
PRUint32 PRUint32
basic_nsAReadableString<CharT>::Left( basic_nsAWritableString<CharT>& aResult, PRUint32 aLengthToCopy ) const basic_nsAReadableString<CharT>::Left( basic_nsAWritableString<CharT>& aResult, PRUint32 aLengthToCopy ) const
{ {
@ -877,6 +882,13 @@ class nsPromiseConcatenation
mStrings[kRightString] = &aRightString; mStrings[kRightString] = &aRightString;
} }
nsPromiseConcatenation( const nsPromiseConcatenation<CharT>& aLeftString, const basic_nsAReadableString<CharT>& aRightString )
: mFragmentIdentifierMask(aLeftString.mFragmentIdentifierMask<<1)
{
mStrings[kLeftString] = &aLeftString;
mStrings[kRightString] = &aRightString;
}
virtual PRUint32 Length() const; virtual PRUint32 Length() const;
virtual PRBool Promises( const basic_nsAReadableString<CharT>& ) const; virtual PRBool Promises( const basic_nsAReadableString<CharT>& ) const;
// virtual PRBool PromisesExactly( const basic_nsAReadableString<CharT>& ) const; // virtual PRBool PromisesExactly( const basic_nsAReadableString<CharT>& ) const;
@ -1239,7 +1251,13 @@ typedef basic_nsAReadableString<char> nsAReadableCString;
typedef basic_nsLiteralString<PRUnichar> nsLiteralString; typedef basic_nsLiteralString<PRUnichar> nsLiteralString;
typedef basic_nsLiteralString<char> nsLiteralCString; typedef basic_nsLiteralString<char> nsLiteralCString;
#define NS_LITERAL_STRING(s) nsLiteralString(s, (sizeof(s)/sizeof(wchar_t))-1)
#ifdef HAVE_CPP_2BYTE_WCHAR_T
#define NS_LITERAL_STRING(s) nsLiteralString(L##s, (sizeof(L##s)/sizeof(wchar_t))-1)
#else
#define NS_LITERAL_STRING(s) NS_ConvertASCIItoUCS2(s, sizeof(s)-1)
#endif
#define NS_LITERAL_CSTRING(s) nsLiteralCString(s, sizeof(s)-1) #define NS_LITERAL_CSTRING(s) nsLiteralCString(s, sizeof(s)-1)
typedef basic_nsLiteralChar<char> nsLiteralChar; typedef basic_nsLiteralChar<char> nsLiteralChar;

View File

@ -133,11 +133,15 @@ class nsReadingIterator
return *get(); return *get();
} }
//#if 0
// An iterator really deserves this, but some compilers (notably IBM VisualAge for OS/2)
// don't like this when |CharT| is a type without members.
pointer pointer
operator->() const operator->() const
{ {
return get(); return get();
} }
//#endif
nsReadingIterator<CharT>& nsReadingIterator<CharT>&
operator++() operator++()
@ -534,11 +538,11 @@ basic_nsAReadableString<CharT>::Implementation() const
*/ */
template <class CharT> template <class CharT>
inline
CharT CharT
basic_nsAReadableString<CharT>::CharAt( PRUint32 aIndex ) const basic_nsAReadableString<CharT>::CharAt( PRUint32 aIndex ) const
{ {
// ??? Is |CharAt()| supposed to be the 'safe' version? NS_ASSERTION(aIndex<Length(), "|CharAt| out-of-range");
nsReadableFragment<CharT> fragment; nsReadableFragment<CharT> fragment;
return *GetReadableFragment(fragment, kFragmentAt, aIndex); return *GetReadableFragment(fragment, kFragmentAt, aIndex);
} }
@ -604,6 +608,7 @@ basic_nsAReadableString<CharT>::Mid( basic_nsAWritableString<CharT>& aResult, PR
} }
template <class CharT> template <class CharT>
inline
PRUint32 PRUint32
basic_nsAReadableString<CharT>::Left( basic_nsAWritableString<CharT>& aResult, PRUint32 aLengthToCopy ) const basic_nsAReadableString<CharT>::Left( basic_nsAWritableString<CharT>& aResult, PRUint32 aLengthToCopy ) const
{ {
@ -877,6 +882,13 @@ class nsPromiseConcatenation
mStrings[kRightString] = &aRightString; mStrings[kRightString] = &aRightString;
} }
nsPromiseConcatenation( const nsPromiseConcatenation<CharT>& aLeftString, const basic_nsAReadableString<CharT>& aRightString )
: mFragmentIdentifierMask(aLeftString.mFragmentIdentifierMask<<1)
{
mStrings[kLeftString] = &aLeftString;
mStrings[kRightString] = &aRightString;
}
virtual PRUint32 Length() const; virtual PRUint32 Length() const;
virtual PRBool Promises( const basic_nsAReadableString<CharT>& ) const; virtual PRBool Promises( const basic_nsAReadableString<CharT>& ) const;
// virtual PRBool PromisesExactly( const basic_nsAReadableString<CharT>& ) const; // virtual PRBool PromisesExactly( const basic_nsAReadableString<CharT>& ) const;
@ -1239,7 +1251,13 @@ typedef basic_nsAReadableString<char> nsAReadableCString;
typedef basic_nsLiteralString<PRUnichar> nsLiteralString; typedef basic_nsLiteralString<PRUnichar> nsLiteralString;
typedef basic_nsLiteralString<char> nsLiteralCString; typedef basic_nsLiteralString<char> nsLiteralCString;
#define NS_LITERAL_STRING(s) nsLiteralString(s, (sizeof(s)/sizeof(wchar_t))-1)
#ifdef HAVE_CPP_2BYTE_WCHAR_T
#define NS_LITERAL_STRING(s) nsLiteralString(L##s, (sizeof(L##s)/sizeof(wchar_t))-1)
#else
#define NS_LITERAL_STRING(s) NS_ConvertASCIItoUCS2(s, sizeof(s)-1)
#endif
#define NS_LITERAL_CSTRING(s) nsLiteralCString(s, sizeof(s)-1) #define NS_LITERAL_CSTRING(s) nsLiteralCString(s, sizeof(s)-1)
typedef basic_nsLiteralChar<char> nsLiteralChar; typedef basic_nsLiteralChar<char> nsLiteralChar;