replace tabs with 4 spaces in all files

git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@600 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
syntheticpp 2006-03-08 17:07:20 +00:00
parent 5b77cc6de3
commit d72b2ff1b3
22 changed files with 554 additions and 545 deletions

View file

@ -40,8 +40,8 @@
#if (defined(LOKI_MAKE_DLL) && defined(LOKI_DLL)) || \ #if (defined(LOKI_MAKE_DLL) && defined(LOKI_DLL)) || \
(defined(LOKI_MAKE_DLL) && defined(LOKI_STATIC)) || \ (defined(LOKI_MAKE_DLL) && defined(LOKI_STATIC)) || \
(defined(LOKI_DLL) && defined(LOKI_STATIC)) (defined(LOKI_DLL) && defined(LOKI_STATIC))
#error export macro error: you could not build AND use the library #error export macro error: you could not build AND use the library
#endif #endif

View file

@ -27,73 +27,73 @@
namespace Loki namespace Loki
{ {
////////////////////////////////////////// //////////////////////////////////////////
/// \class ConstPropPtr /// \class ConstPropPtr
/// ///
/// \ingroup PimplGroup /// \ingroup PimplGroup
/// Simple const propagating smart pointer /// Simple const propagating smart pointer
/// Is the default smart pointer of Pimpl. /// Is the default smart pointer of Pimpl.
////////////////////////////////////////// //////////////////////////////////////////
template<class T> template<class T>
struct ConstPropPtr struct ConstPropPtr
{ {
explicit ConstPropPtr(T* p) : ptr_(p) {} explicit ConstPropPtr(T* p) : ptr_(p) {}
~ConstPropPtr() { delete ptr_; ptr_ = 0; } ~ConstPropPtr() { delete ptr_; ptr_ = 0; }
T* operator->() { return ptr_; } T* operator->() { return ptr_; }
T& operator*() { return *ptr_; } T& operator*() { return *ptr_; }
const T* operator->() const { return ptr_; } const T* operator->() const { return ptr_; }
const T& operator*() const { return *ptr_; } const T& operator*() const { return *ptr_; }
private: private:
ConstPropPtr(); ConstPropPtr();
ConstPropPtr(const ConstPropPtr&); ConstPropPtr(const ConstPropPtr&);
ConstPropPtr& operator=(const ConstPropPtr&); ConstPropPtr& operator=(const ConstPropPtr&);
T* ptr_; T* ptr_;
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class Pimpl /// \class Pimpl
/// ///
/// \ingroup PimplGroup /// \ingroup PimplGroup
/// ///
/// Implements the Pimpl idiom. It's a wrapper for a smart pointer which /// Implements the Pimpl idiom. It's a wrapper for a smart pointer which
/// automatically creates and deletes the implementation object and adds /// automatically creates and deletes the implementation object and adds
/// const propagation to the smart pointer. /// const propagation to the smart pointer.
/// ///
/// \par Usage /// \par Usage
/// see test/Pimpl /// see test/Pimpl
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
template template
< <
class T, class T,
typename Pointer = ConstPropPtr<T> typename Pointer = ConstPropPtr<T>
> >
class Pimpl class Pimpl
{ {
public: public:
typedef T Impl; typedef T Impl;
Pimpl() : ptr_(new T) Pimpl() : ptr_(new T)
{} {}
~Pimpl() ~Pimpl()
{ {
// Don't compile with incomplete type // Don't compile with incomplete type
// //
// If compilation brakes here make sure // If compilation brakes here make sure
// the compiler does not auto-generate the // the compiler does not auto-generate the
// destructor of the class hosting the pimpl: // destructor of the class hosting the pimpl:
// - implement the destructor of the class // - implement the destructor of the class
// - don't inline the destructor // - don't inline the destructor
typedef char T_must_be_defined[sizeof(T) ? 1 : -1 ]; typedef char T_must_be_defined[sizeof(T) ? 1 : -1 ];
} }
T* operator->() T* operator->()
{ {
return ptr_.operator->(); return ptr_.operator->();
} }
@ -113,22 +113,22 @@ namespace Loki
return ptr_.operator*(); return ptr_.operator*();
} }
Pointer& wrapped() Pointer& wrapped()
{ {
return ptr_; return ptr_;
} }
const Pointer& wrapped() const const Pointer& wrapped() const
{ {
return ptr_; return ptr_;
} }
private: private:
Pimpl(const Pimpl&); Pimpl(const Pimpl&);
Pimpl& operator=(const Pimpl&); Pimpl& operator=(const Pimpl&);
Pointer ptr_; Pointer ptr_;
}; };
@ -139,55 +139,55 @@ namespace Loki
}; };
////////////////////////////////////////// //////////////////////////////////////////
/// \class ImplT /// \class ImplT
/// ///
/// \ingroup PimplGroup /// \ingroup PimplGroup
/// Convenience template for the /// Convenience template for the
/// implementations which PimplT points to. /// implementations which PimplT points to.
////////////////////////////////////////// //////////////////////////////////////////
template<class T> template<class T>
struct ImplT; struct ImplT;
////////////////////////////////////////// //////////////////////////////////////////
/// \class PImplT /// \class PImplT
/// ///
/// \ingroup PimplGroup /// \ingroup PimplGroup
/// Convenience template which uses ImplT /// Convenience template which uses ImplT
/// as implementation structure /// as implementation structure
////////////////////////////////////////// //////////////////////////////////////////
template<class T, template<class> class Ptr = ConstPropPtr> template<class T, template<class> class Ptr = ConstPropPtr>
struct PimplT struct PimplT
{ {
typedef T Impl; typedef T Impl;
// declare pimpl // declare pimpl
typedef Pimpl<ImplT<T>, Ptr<ImplT<T> > > Type; typedef Pimpl<ImplT<T>, Ptr<ImplT<T> > > Type;
// inherit pimpl // inherit pimpl
typedef PimplOwner<ImplT<T>, Ptr<ImplT<T> > > Owner; typedef PimplOwner<ImplT<T>, Ptr<ImplT<T> > > Owner;
}; };
template<class T, class UsedPimpl = typename PimplT<T>::Type > template<class T, class UsedPimpl = typename PimplT<T>::Type >
struct RimplT struct RimplT
{ {
typedef typename UsedPimpl::Impl & Type; typedef typename UsedPimpl::Impl & Type;
class Owner class Owner
{ {
UsedPimpl pimpl; UsedPimpl pimpl;
public: public:
Owner() : LOKI_INHERITED_RIMPL_NAME(*pimpl) Owner() : LOKI_INHERITED_RIMPL_NAME(*pimpl)
{} {}
Type LOKI_INHERITED_RIMPL_NAME; Type LOKI_INHERITED_RIMPL_NAME;
}; };
}; };
@ -196,6 +196,9 @@ namespace Loki
#endif #endif
// $Log$ // $Log$
// Revision 1.19 2006/03/08 17:07:11 syntheticpp
// replace tabs with 4 spaces in all files
//
// Revision 1.18 2006/03/08 16:39:27 syntheticpp // Revision 1.18 2006/03/08 16:39:27 syntheticpp
// add documenation // add documenation
// //

View file

@ -49,7 +49,7 @@ namespace Loki
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \function ByRef /// \function ByRef
/// ///
/// \ingroup ExceptionGroup /// \ingroup ExceptionGroup

View file

@ -22,98 +22,98 @@
namespace Loki namespace Loki
{ {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// //
// Helper classes/functions for RegisterByCreateSet // Helper classes/functions for RegisterByCreateSet
// //
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \ingroup Register /// \ingroup Register
/// Must be specialized be the user /// Must be specialized be the user
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
template<class t> bool RegisterFunction(); template<class t> bool RegisterFunction();
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \ingroup Register /// \ingroup Register
/// Must be specialized be the user /// Must be specialized be the user
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
template<class t> bool UnRegisterFunction(); template<class t> bool UnRegisterFunction();
namespace Private namespace Private
{ {
template<class T> template<class T>
struct RegisterOnCreate struct RegisterOnCreate
{ {
RegisterOnCreate() { RegisterFunction<T>(); } RegisterOnCreate() { RegisterFunction<T>(); }
}; };
template<class T> template<class T>
struct UnRegisterOnDelete struct UnRegisterOnDelete
{ {
~UnRegisterOnDelete() { UnRegisterFunction<T>(); } ~UnRegisterOnDelete() { UnRegisterFunction<T>(); }
}; };
template<class T> template<class T>
struct RegisterOnCreateElement struct RegisterOnCreateElement
{ {
RegisterOnCreate<T> registerObj; RegisterOnCreate<T> registerObj;
}; };
template<class T> template<class T>
struct UnRegisterOnDeleteElement struct UnRegisterOnDeleteElement
{ {
UnRegisterOnDelete<T> unregisterObj; UnRegisterOnDelete<T> unregisterObj;
}; };
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class RegisterOnCreateSet /// \class RegisterOnCreateSet
/// ///
/// \ingroup Register /// \ingroup Register
/// Implements a generic register class which registers classes of a typelist /// Implements a generic register class which registers classes of a typelist
/// ///
/// \par Usage /// \par Usage
/// see test/Register /// see test/Register
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
template<typename ElementList> template<typename ElementList>
struct RegisterOnCreateSet struct RegisterOnCreateSet
: GenScatterHierarchy<ElementList, Private::RegisterOnCreateElement> : GenScatterHierarchy<ElementList, Private::RegisterOnCreateElement>
{}; {};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \class UnRegisterOnDeleteSet /// \class UnRegisterOnDeleteSet
/// ///
/// \ingroup Register /// \ingroup Register
/// Implements a generic register class which unregisters classes of a typelist /// Implements a generic register class which unregisters classes of a typelist
/// ///
/// \par Usage /// \par Usage
/// see test/Register /// see test/Register
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
template<typename ElementList> template<typename ElementList>
struct UnRegisterOnDeleteSet struct UnRegisterOnDeleteSet
: GenScatterHierarchy<ElementList, Private::UnRegisterOnDeleteElement> : GenScatterHierarchy<ElementList, Private::UnRegisterOnDeleteElement>
{}; {};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// \def LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST ) /// \def LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST )
/// ///
/// \ingroup Register /// \ingroup Register
/// Check if CLASS is in the typelist LIST. /// Check if CLASS is in the typelist LIST.
/// ///
/// \par Usage /// \par Usage
/// see test/Register /// see test/Register
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#define LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST ) \ #define LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST ) \
\ \
struct Loki_##CLASS##LIST_OK{typedef int class_##CLASS##_is_not_in_##LIST;};\ struct Loki_##CLASS##LIST_OK{typedef int class_##CLASS##_is_not_in_##LIST;};\
typedef Loki::Select<Loki::TL::IndexOf<LIST, CLASS>::value == -1, \ typedef Loki::Select<Loki::TL::IndexOf<LIST, CLASS>::value == -1, \
CLASS,Loki_##CLASS##LIST_OK >::Result IsInList##CLASS##LIST; \ CLASS,Loki_##CLASS##LIST_OK >::Result IsInList##CLASS##LIST; \
typedef IsInList##CLASS##LIST::class_##CLASS##_is_not_in_##LIST \ typedef IsInList##CLASS##LIST::class_##CLASS##_is_not_in_##LIST \
isInListTest##CLASS##LIST; isInListTest##CLASS##LIST;
} // namespace Loki } // namespace Loki

View file

@ -218,7 +218,7 @@ namespace Loki
std::size_t maxSmallObjectSize = LOKI_MAX_SMALL_OBJECT_SIZE, std::size_t maxSmallObjectSize = LOKI_MAX_SMALL_OBJECT_SIZE,
std::size_t objectAlignSize = LOKI_DEFAULT_OBJECT_ALIGNMENT, std::size_t objectAlignSize = LOKI_DEFAULT_OBJECT_ALIGNMENT,
template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME, template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME,
class MutexPolicy = LOKI_DEFAULT_MUTEX class MutexPolicy = LOKI_DEFAULT_MUTEX
> >
class AllocatorSingleton : public SmallObjAllocator class AllocatorSingleton : public SmallObjAllocator
{ {
@ -283,7 +283,7 @@ namespace Loki
std::size_t MSOS, std::size_t MSOS,
std::size_t OAS, std::size_t OAS,
template <class> class LP, template <class> class LP,
class MX class MX
> >
void AllocatorSingleton< TM, CS, MSOS, OAS, LP, MX >::ClearExtraMemory( void ) void AllocatorSingleton< TM, CS, MSOS, OAS, LP, MX >::ClearExtraMemory( void )
{ {
@ -299,7 +299,7 @@ namespace Loki
std::size_t MSOS, std::size_t MSOS,
std::size_t OAS, std::size_t OAS,
template <class> class LP, template <class> class LP,
class MX class MX
> >
bool AllocatorSingleton< TM, CS, MSOS, OAS, LP, MX >::IsCorrupted( void ) bool AllocatorSingleton< TM, CS, MSOS, OAS, LP, MX >::IsCorrupted( void )
{ {
@ -327,7 +327,7 @@ namespace Loki
std::size_t MSOS, std::size_t MSOS,
std::size_t OAS, std::size_t OAS,
template <class> class LP, template <class> class LP,
class MX class MX
> >
inline unsigned int GetLongevity( inline unsigned int GetLongevity(
AllocatorSingleton< TM, CS, MSOS, OAS, LP, MX > * ) AllocatorSingleton< TM, CS, MSOS, OAS, LP, MX > * )
@ -421,7 +421,7 @@ namespace Loki
std::size_t maxSmallObjectSize, std::size_t maxSmallObjectSize,
std::size_t objectAlignSize, std::size_t objectAlignSize,
template <class> class LifetimePolicy, template <class> class LifetimePolicy,
class MutexPolicy class MutexPolicy
> >
class SmallObjectBase class SmallObjectBase
{ {
@ -578,7 +578,7 @@ namespace Loki
std::size_t maxSmallObjectSize = LOKI_MAX_SMALL_OBJECT_SIZE, std::size_t maxSmallObjectSize = LOKI_MAX_SMALL_OBJECT_SIZE,
std::size_t objectAlignSize = LOKI_DEFAULT_OBJECT_ALIGNMENT, std::size_t objectAlignSize = LOKI_DEFAULT_OBJECT_ALIGNMENT,
template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME, template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME,
class MutexPolicy = LOKI_DEFAULT_MUTEX class MutexPolicy = LOKI_DEFAULT_MUTEX
> >
class SmallObject : public SmallObjectBase< ThreadingModel, chunkSize, class SmallObject : public SmallObjectBase< ThreadingModel, chunkSize,
maxSmallObjectSize, objectAlignSize, LifetimePolicy, MutexPolicy > maxSmallObjectSize, objectAlignSize, LifetimePolicy, MutexPolicy >
@ -614,7 +614,7 @@ namespace Loki
std::size_t maxSmallObjectSize = LOKI_MAX_SMALL_OBJECT_SIZE, std::size_t maxSmallObjectSize = LOKI_MAX_SMALL_OBJECT_SIZE,
std::size_t objectAlignSize = LOKI_DEFAULT_OBJECT_ALIGNMENT, std::size_t objectAlignSize = LOKI_DEFAULT_OBJECT_ALIGNMENT,
template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME, template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME,
class MutexPolicy = LOKI_DEFAULT_MUTEX class MutexPolicy = LOKI_DEFAULT_MUTEX
> >
class SmallValueObject : public SmallObjectBase< ThreadingModel, chunkSize, class SmallValueObject : public SmallObjectBase< ThreadingModel, chunkSize,
maxSmallObjectSize, objectAlignSize, LifetimePolicy, MutexPolicy > maxSmallObjectSize, objectAlignSize, LifetimePolicy, MutexPolicy >
@ -634,6 +634,9 @@ namespace Loki
// Nov. 26, 2004: re-implemented by Rich Sposato. // Nov. 26, 2004: re-implemented by Rich Sposato.
// //
// $Log$ // $Log$
// Revision 1.29 2006/03/08 17:07:11 syntheticpp
// replace tabs with 4 spaces in all files
//
// Revision 1.28 2006/02/27 19:59:20 syntheticpp // Revision 1.28 2006/02/27 19:59:20 syntheticpp
// add support of loki.dll // add support of loki.dll
// //

View file

@ -793,7 +793,7 @@ namespace Loki
class ConversionPolicy = DisallowConversion, class ConversionPolicy = DisallowConversion,
template <class> class CheckingPolicy = AssertCheck, template <class> class CheckingPolicy = AssertCheck,
template <class> class StoragePolicy = DefaultSPStorage, template <class> class StoragePolicy = DefaultSPStorage,
template<class> class ConstnessPolicy = LOKI_DEFAULT_CONSTNESS template<class> class ConstnessPolicy = LOKI_DEFAULT_CONSTNESS
> >
struct SmartPtrDef struct SmartPtrDef
{ {
@ -804,7 +804,7 @@ namespace Loki
ConversionPolicy, ConversionPolicy,
CheckingPolicy, CheckingPolicy,
StoragePolicy, StoragePolicy,
ConstnessPolicy ConstnessPolicy
> >
type; type;
}; };
@ -1362,6 +1362,9 @@ namespace std
#endif // SMARTPTR_INC_ #endif // SMARTPTR_INC_
// $Log$ // $Log$
// Revision 1.24 2006/03/08 17:07:11 syntheticpp
// replace tabs with 4 spaces in all files
//
// Revision 1.23 2006/02/28 16:55:56 syntheticpp // Revision 1.23 2006/02/28 16:55:56 syntheticpp
// undo disabling checking, remove warnings, many thanks to Sam Miller // undo disabling checking, remove warnings, many thanks to Sam Miller
// //

View file

@ -234,9 +234,9 @@ public:
template <class ForwardIterator> template <class ForwardIterator>
void append(ForwardIterator b, ForwardIterator e) void append(ForwardIterator b, ForwardIterator e)
{ {
const size_type const size_type
sz = std::distance(b, e), sz = std::distance(b, e),
neededCapacity = size() + sz; neededCapacity = size() + sz;
if (capacity() < neededCapacity) if (capacity() < neededCapacity)
{ {
@ -245,7 +245,7 @@ public:
assert(!(le(begin(), &*b) && le(&*b, end()))); assert(!(le(begin(), &*b) && le(&*b, end())));
reserve(neededCapacity); reserve(neededCapacity);
} }
std::copy(b, e, end()); std::copy(b, e, end());
pData_->pEnd_ += sz; pData_->pEnd_ += sz;
} }

View file

@ -19,13 +19,13 @@ namespace flex_string_details
{ {
template <class InIt, class OutIt> template <class InIt, class OutIt>
OutIt copy_n(InIt b, typename std::iterator_traits<InIt>::difference_type n, OutIt d) OutIt copy_n(InIt b, typename std::iterator_traits<InIt>::difference_type n, OutIt d)
{ {
for (; n != 0; --n, ++b, ++d) for (; n != 0; --n, ++b, ++d)
{ {
*d = *b; *d = *b;
} }
return d; return d;
} }
template <class Pod, class T> template <class Pod, class T>
inline void pod_fill(Pod* b, Pod* e, T c) inline void pod_fill(Pod* b, Pod* e, T c)

View file

@ -170,7 +170,7 @@ class flex_string : private Storage
struct Invariant struct Invariant
{ {
#ifndef NDEBUG #ifndef NDEBUG
Invariant(const flex_string& s) : s_(s) Invariant(const flex_string& s) : s_(s)
{ {
assert(s_.Sane()); assert(s_.Sane());
} }
@ -181,7 +181,7 @@ class flex_string : private Storage
private: private:
const flex_string& s_; const flex_string& s_;
#else #else
Invariant(const flex_string&) {} Invariant(const flex_string&) {}
#endif #endif
Invariant& operator=(const Invariant&); Invariant& operator=(const Invariant&);
}; };
@ -218,7 +218,7 @@ private:
static size_type Min(size_type lhs, size_type rhs) static size_type Min(size_type lhs, size_type rhs)
{ return lhs < rhs ? lhs : rhs; } { return lhs < rhs ? lhs : rhs; }
static void Procust(size_type& n, size_type nmax) static void Procust(size_type& n, size_type nmax)
{ if (n > nmax) n = nmax; } { if (n > nmax) n = nmax; }
public: public:
// 21.3.1 construct/copy/destroy // 21.3.1 construct/copy/destroy
@ -362,7 +362,7 @@ public:
flex_string& operator+=(const value_type c) flex_string& operator+=(const value_type c)
{ {
push_back(c); push_back(c);
return *this; return *this;
} }
@ -374,21 +374,21 @@ public:
{ {
const size_type sz = str.size(); const size_type sz = str.size();
Enforce(pos <= sz, static_cast<std::out_of_range*>(0), ""); Enforce(pos <= sz, static_cast<std::out_of_range*>(0), "");
Procust(n, sz - pos); Procust(n, sz - pos);
return append(str.data() + pos, n); return append(str.data() + pos, n);
} }
flex_string& append(const value_type* s, const size_type n) flex_string& append(const value_type* s, const size_type n)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
static std::less_equal<const value_type*> le; static std::less_equal<const value_type*> le;
if (le(&*begin(), s) && le(s, &*end())) // aliasing if (le(&*begin(), s) && le(s, &*end())) // aliasing
{ {
const size_type offset = s - &*begin(); const size_type offset = s - &*begin();
Storage::reserve(size() + n); Storage::reserve(size() + n);
s = &*begin() + offset; s = &*begin() + offset;
} }
Storage::append(s, s + n); Storage::append(s, s + n);
return *this; return *this;
} }
@ -405,7 +405,7 @@ public:
template<class InputIterator> template<class InputIterator>
flex_string& append(InputIterator first, InputIterator last) flex_string& append(InputIterator first, InputIterator last)
{ {
insert(end(), first, last); insert(end(), first, last);
return *this; return *this;
} }
@ -416,7 +416,7 @@ public:
{ {
reserve(cap << 1u); reserve(cap << 1u);
} }
Storage::append(&c, &c + 1); Storage::append(&c, &c + 1);
} }
flex_string& assign(const flex_string& str) flex_string& assign(const flex_string& str)
@ -428,25 +428,25 @@ public:
flex_string& assign(const flex_string& str, const size_type pos, flex_string& assign(const flex_string& str, const size_type pos,
size_type n) size_type n)
{ {
const size_type sz = str.size(); const size_type sz = str.size();
Enforce(pos <= sz, static_cast<std::out_of_range*>(0), ""); Enforce(pos <= sz, static_cast<std::out_of_range*>(0), "");
Procust(n, sz - pos); Procust(n, sz - pos);
return assign(str.data() + pos, n); return assign(str.data() + pos, n);
} }
flex_string& assign(const value_type* s, const size_type n) flex_string& assign(const value_type* s, const size_type n)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
if (size() >= n) if (size() >= n)
{ {
std::copy(s, s + n, begin()); std::copy(s, s + n, begin());
resize(n); resize(n);
} }
else else
{ {
const value_type *const s2 = s + size(); const value_type *const s2 = s + size();
std::copy(s, s2, begin()); std::copy(s, s2, begin());
append(s2, n - size()); append(s2, n - size());
} }
return *this; return *this;
@ -466,16 +466,16 @@ public:
size_type pos2, size_type n) size_type pos2, size_type n)
{ {
Enforce(pos2 <= str.length(), static_cast<std::out_of_range*>(0), ""); Enforce(pos2 <= str.length(), static_cast<std::out_of_range*>(0), "");
Procust(n, str.length() - pos2); Procust(n, str.length() - pos2);
return insert(pos1, str.data() + pos2, n); return insert(pos1, str.data() + pos2, n);
} }
flex_string& insert(size_type pos, const value_type* s, size_type n) flex_string& insert(size_type pos, const value_type* s, size_type n)
{ {
Enforce(pos <= length(), static_cast<std::out_of_range*>(0), ""); Enforce(pos <= length(), static_cast<std::out_of_range*>(0), "");
insert(begin() + pos, s, s + n); insert(begin() + pos, s, s + n);
return *this; return *this;
} }
flex_string& insert(size_type pos, const value_type* s) flex_string& insert(size_type pos, const value_type* s)
{ return insert(pos, s, traits_type::length(s)); } { return insert(pos, s, traits_type::length(s)); }
@ -483,13 +483,13 @@ public:
flex_string& insert(size_type pos, size_type n, value_type c) flex_string& insert(size_type pos, size_type n, value_type c)
{ {
Enforce(pos <= length(), static_cast<std::out_of_range*>(0), ""); Enforce(pos <= length(), static_cast<std::out_of_range*>(0), "");
insert(begin() + pos, n, c); insert(begin() + pos, n, c);
return *this; return *this;
} }
iterator insert(const iterator p, const value_type c) iterator insert(const iterator p, const value_type c)
{ {
const size_type pos = p - begin(); const size_type pos = p - begin();
insert(p, 1, c); insert(p, 1, c);
return begin() + pos; return begin() + pos;
} }
@ -500,122 +500,122 @@ private:
flex_string& InsertImplDiscr(iterator p, flex_string& InsertImplDiscr(iterator p,
size_type n, value_type c, Selector<1>) size_type n, value_type c, Selector<1>)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
assert(p >= begin() && p <= end()); assert(p >= begin() && p <= end());
if (capacity() - size() < n) if (capacity() - size() < n)
{ {
const size_type sz = p - begin(); const size_type sz = p - begin();
reserve(size() + n); reserve(size() + n);
p = begin() + sz; p = begin() + sz;
} }
const iterator oldEnd = end(); const iterator oldEnd = end();
//if (p + n < oldEnd) // replaced because of crash (pk) //if (p + n < oldEnd) // replaced because of crash (pk)
if( n < size_type(oldEnd - p)) if( n < size_type(oldEnd - p))
{ {
append(oldEnd - n, oldEnd); append(oldEnd - n, oldEnd);
//std::copy( //std::copy(
// reverse_iterator(oldEnd - n), // reverse_iterator(oldEnd - n),
// reverse_iterator(p), // reverse_iterator(p),
// reverse_iterator(oldEnd)); // reverse_iterator(oldEnd));
flex_string_details::pod_move(&*p, &*oldEnd - n, &*p + n); flex_string_details::pod_move(&*p, &*oldEnd - n, &*p + n);
std::fill(p, p + n, c); std::fill(p, p + n, c);
} }
else else
{ {
append(n - (end() - p), c); append(n - (end() - p), c);
append(p, oldEnd); append(p, oldEnd);
std::fill(p, oldEnd, c); std::fill(p, oldEnd, c);
} }
return *this; return *this;
} }
template<class InputIterator> template<class InputIterator>
flex_string& InsertImplDiscr(iterator i, flex_string& InsertImplDiscr(iterator i,
InputIterator b, InputIterator e, Selector<0>) InputIterator b, InputIterator e, Selector<0>)
{ {
InsertImpl(i, b, e, InsertImpl(i, b, e,
typename std::iterator_traits<InputIterator>::iterator_category()); typename std::iterator_traits<InputIterator>::iterator_category());
return *this; return *this;
} }
template <class FwdIterator> template <class FwdIterator>
void InsertImpl(iterator i, void InsertImpl(iterator i,
FwdIterator s1, FwdIterator s2, std::forward_iterator_tag) FwdIterator s1, FwdIterator s2, std::forward_iterator_tag)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
const size_type pos = i - begin(); const size_type pos = i - begin();
const typename std::iterator_traits<FwdIterator>::difference_type n2 = const typename std::iterator_traits<FwdIterator>::difference_type n2 =
std::distance(s1, s2); std::distance(s1, s2);
assert(n2 >= 0); assert(n2 >= 0);
using namespace flex_string_details; using namespace flex_string_details;
assert(pos <= size()); assert(pos <= size());
const typename std::iterator_traits<FwdIterator>::difference_type maxn2 = const typename std::iterator_traits<FwdIterator>::difference_type maxn2 =
capacity() - size(); capacity() - size();
if (maxn2 < n2) if (maxn2 < n2)
{ {
// realloc the string // realloc the string
static const std::less_equal<const value_type*> le = static const std::less_equal<const value_type*> le =
std::less_equal<const value_type*>(); std::less_equal<const value_type*>();
assert(!(le(&*begin(), &*s1) && le(&*s1, &*end()))); assert(!(le(&*begin(), &*s1) && le(&*s1, &*end())));
reserve(size() + n2); reserve(size() + n2);
i = begin() + pos; i = begin() + pos;
}
if (pos + n2 <= size())
{
//const iterator oldEnd = end();
//Storage::append(oldEnd - n2, n2);
//std::copy(i, oldEnd - n2, i + n2);
const iterator tailBegin = end() - n2;
Storage::append(tailBegin, tailBegin + n2);
//std::copy(i, tailBegin, i + n2);
std::copy(reverse_iterator(tailBegin), reverse_iterator(i),
reverse_iterator(tailBegin + n2));
std::copy(s1, s2, i);
}
else
{
FwdIterator t = s1;
const size_type old_size = size();
std::advance(t, old_size - pos);
assert(std::distance(t, s2) >= 0);
Storage::append(t, s2);
Storage::append(data() + pos, data() + old_size);
std::copy(s1, t, i);
} }
if (pos + n2 <= size())
{
//const iterator oldEnd = end();
//Storage::append(oldEnd - n2, n2);
//std::copy(i, oldEnd - n2, i + n2);
const iterator tailBegin = end() - n2;
Storage::append(tailBegin, tailBegin + n2);
//std::copy(i, tailBegin, i + n2);
std::copy(reverse_iterator(tailBegin), reverse_iterator(i),
reverse_iterator(tailBegin + n2));
std::copy(s1, s2, i);
}
else
{
FwdIterator t = s1;
const size_type old_size = size();
std::advance(t, old_size - pos);
assert(std::distance(t, s2) >= 0);
Storage::append(t, s2);
Storage::append(data() + pos, data() + old_size);
std::copy(s1, t, i);
}
} }
template <class InputIterator> template <class InputIterator>
void InsertImpl(iterator i1, iterator i2, void InsertImpl(iterator i1, iterator i2,
InputIterator b, InputIterator e, std::input_iterator_tag) InputIterator b, InputIterator e, std::input_iterator_tag)
{ {
flex_string temp(begin(), i1); flex_string temp(begin(), i1);
for (; b != e; ++b) for (; b != e; ++b)
{ {
temp.push_back(*b); temp.push_back(*b);
} }
temp.append(i2, end()); temp.append(i2, end());
swap(temp); swap(temp);
} }
public: public:
template <class ItOrLength, class ItOrChar> template <class ItOrLength, class ItOrChar>
void insert(iterator p, ItOrLength first_or_n, ItOrChar last_or_c) void insert(iterator p, ItOrLength first_or_n, ItOrChar last_or_c)
{ {
Selector<std::numeric_limits<ItOrLength>::is_specialized> sel; Selector<std::numeric_limits<ItOrLength>::is_specialized> sel;
InsertImplDiscr(p, first_or_n, last_or_c, sel); InsertImplDiscr(p, first_or_n, last_or_c, sel);
} }
flex_string& erase(size_type pos = 0, size_type n = npos) flex_string& erase(size_type pos = 0, size_type n = npos)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
Enforce(pos <= length(), static_cast<std::out_of_range*>(0), ""); Enforce(pos <= length(), static_cast<std::out_of_range*>(0), "");
Procust(n, length() - pos); Procust(n, length() - pos);
std::copy(begin() + pos + n, end(), begin() + pos); std::copy(begin() + pos + n, end(), begin() + pos);
resize(length() - n); resize(length() - n);
return *this; return *this;
} }
@ -633,12 +633,12 @@ public:
return begin() + pos; return begin() + pos;
} }
// Replaces at most n1 chars of *this, starting with pos1 with the content of str // Replaces at most n1 chars of *this, starting with pos1 with the content of str
flex_string& replace(size_type pos1, size_type n1, const flex_string& str) flex_string& replace(size_type pos1, size_type n1, const flex_string& str)
{ return replace(pos1, n1, str.data(), str.size()); } { return replace(pos1, n1, str.data(), str.size()); }
// Replaces at most n1 chars of *this, starting with pos1, // Replaces at most n1 chars of *this, starting with pos1,
// with at most n2 chars of str starting with pos2 // with at most n2 chars of str starting with pos2
flex_string& replace(size_type pos1, size_type n1, const flex_string& str, flex_string& replace(size_type pos1, size_type n1, const flex_string& str,
size_type pos2, size_type n2) size_type pos2, size_type n2)
{ {
@ -648,34 +648,34 @@ public:
} }
/* /*
// Replaces at most n1 chars of *this, starting with pos, // Replaces at most n1 chars of *this, starting with pos,
// with at most n2 chars of str. // with at most n2 chars of str.
// str must have at least n2 chars. // str must have at least n2 chars.
flex_string& replace(const size_type pos, size_type n1, flex_string& replace(const size_type pos, size_type n1,
const value_type* s1, const size_type n2) const value_type* s1, const size_type n2)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
Enforce(pos <= size(), (std::out_of_range*)0, ""); Enforce(pos <= size(), (std::out_of_range*)0, "");
Procust(n1, size() - pos); Procust(n1, size() - pos);
const iterator b = begin() + pos; const iterator b = begin() + pos;
return replace(b, b + n1, s1, s1 + n2); return replace(b, b + n1, s1, s1 + n2);
using namespace flex_string_details; using namespace flex_string_details;
const int delta = int(n2 - n1); const int delta = int(n2 - n1);
static const std::less_equal<const value_type*> le; static const std::less_equal<const value_type*> le;
const bool aliased = le(&*begin(), s1) && le(s1, &*end()); const bool aliased = le(&*begin(), s1) && le(s1, &*end());
// From here on we're dealing with an aliased replace // From here on we're dealing with an aliased replace
if (delta <= 0) if (delta <= 0)
{ {
// simple case, we're shrinking // simple case, we're shrinking
pod_move(s1, s1 + n2, &*begin() + pos); pod_move(s1, s1 + n2, &*begin() + pos);
pod_move(&*begin() + pos + n1, &*end(), &*begin() + pos + n1 + delta); pod_move(&*begin() + pos + n1, &*end(), &*begin() + pos + n1 + delta);
resize(size() + delta); resize(size() + delta);
return *this; return *this;
} }
// From here on we deal with aliased growth // From here on we deal with aliased growth
if (capacity() < size() + delta) if (capacity() < size() + delta)
{ {
// realloc the string // realloc the string
@ -726,25 +726,25 @@ public:
} }
*/ */
// Replaces at most n1 chars of *this, starting with pos, with chars from s // Replaces at most n1 chars of *this, starting with pos, with chars from s
flex_string& replace(size_type pos, size_type n1, const value_type* s) flex_string& replace(size_type pos, size_type n1, const value_type* s)
{ return replace(pos, n1, s, traits_type::length(s)); } { return replace(pos, n1, s, traits_type::length(s)); }
// Replaces at most n1 chars of *this, starting with pos, with n2 occurences of c // Replaces at most n1 chars of *this, starting with pos, with n2 occurences of c
// consolidated with // consolidated with
// Replaces at most n1 chars of *this, starting with pos, // Replaces at most n1 chars of *this, starting with pos,
// with at most n2 chars of str. // with at most n2 chars of str.
// str must have at least n2 chars. // str must have at least n2 chars.
template <class StrOrLength, class NumOrChar> template <class StrOrLength, class NumOrChar>
flex_string& replace(size_type pos, size_type n1, flex_string& replace(size_type pos, size_type n1,
StrOrLength s_or_n2, NumOrChar n_or_c) StrOrLength s_or_n2, NumOrChar n_or_c)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
Enforce(pos <= size(), static_cast<std::out_of_range*>(0), ""); Enforce(pos <= size(), static_cast<std::out_of_range*>(0), "");
Procust(n1, length() - pos); Procust(n1, length() - pos);
const iterator b = begin() + pos; const iterator b = begin() + pos;
return replace(b, b + n1, s_or_n2, n_or_c); return replace(b, b + n1, s_or_n2, n_or_c);
} }
flex_string& replace(iterator i1, iterator i2, const flex_string& str) flex_string& replace(iterator i1, iterator i2, const flex_string& str)
@ -757,26 +757,26 @@ private:
flex_string& ReplaceImplDiscr(iterator i1, iterator i2, flex_string& ReplaceImplDiscr(iterator i1, iterator i2,
const value_type* s, size_type n, Selector<2>) const value_type* s, size_type n, Selector<2>)
{ {
assert(i1 <= i2); assert(i1 <= i2);
assert(begin() <= i1 && i1 <= end()); assert(begin() <= i1 && i1 <= end());
assert(begin() <= i2 && i2 <= end()); assert(begin() <= i2 && i2 <= end());
return replace(i1, i2, s, s + n); return replace(i1, i2, s, s + n);
} }
flex_string& ReplaceImplDiscr(iterator i1, iterator i2, flex_string& ReplaceImplDiscr(iterator i1, iterator i2,
size_type n2, value_type c, Selector<1>) size_type n2, value_type c, Selector<1>)
{ {
const size_type n1 = i2 - i1; const size_type n1 = i2 - i1;
if (n1 > n2) if (n1 > n2)
{ {
std::fill(i1, i1 + n2, c); std::fill(i1, i1 + n2, c);
erase(i1 + n2, i2); erase(i1 + n2, i2);
} }
else else
{ {
std::fill(i1, i2, c); std::fill(i1, i2, c);
insert(i2, n2 - n1, c); insert(i2, n2 - n1, c);
} }
return *this; return *this;
} }
@ -784,60 +784,60 @@ private:
flex_string& ReplaceImplDiscr(iterator i1, iterator i2, flex_string& ReplaceImplDiscr(iterator i1, iterator i2,
InputIterator b, InputIterator e, Selector<0>) InputIterator b, InputIterator e, Selector<0>)
{ {
ReplaceImpl(i1, i2, b, e, ReplaceImpl(i1, i2, b, e,
typename std::iterator_traits<InputIterator>::iterator_category()); typename std::iterator_traits<InputIterator>::iterator_category());
return *this; return *this;
} }
template <class FwdIterator> template <class FwdIterator>
void ReplaceImpl(iterator i1, iterator i2, void ReplaceImpl(iterator i1, iterator i2,
FwdIterator s1, FwdIterator s2, std::forward_iterator_tag) FwdIterator s1, FwdIterator s2, std::forward_iterator_tag)
{ {
Invariant checker(*this); Invariant checker(*this);
(void) checker; (void) checker;
const typename std::iterator_traits<iterator>::difference_type n1 = const typename std::iterator_traits<iterator>::difference_type n1 =
i2 - i1; i2 - i1;
assert(n1 >= 0); assert(n1 >= 0);
const typename std::iterator_traits<FwdIterator>::difference_type n2 = const typename std::iterator_traits<FwdIterator>::difference_type n2 =
std::distance(s1, s2); std::distance(s1, s2);
assert(n2 >= 0); assert(n2 >= 0);
// Handle aliased replace // Handle aliased replace
static const std::less_equal<const value_type*> le = static const std::less_equal<const value_type*> le =
std::less_equal<const value_type*>(); std::less_equal<const value_type*>();
const bool aliased = le(&*begin(), &*s1) && le(&*s1, &*end()); const bool aliased = le(&*begin(), &*s1) && le(&*s1, &*end());
if (aliased /* && capacity() < size() - n1 + n2 */) if (aliased /* && capacity() < size() - n1 + n2 */)
{ {
// Aliased replace, copy to new string // Aliased replace, copy to new string
flex_string temp; flex_string temp;
temp.reserve(size() - n1 + n2); temp.reserve(size() - n1 + n2);
temp.append(begin(), i1).append(s1, s2).append(i2, end()); temp.append(begin(), i1).append(s1, s2).append(i2, end());
swap(temp); swap(temp);
return; return;
} }
if (n1 > n2) if (n1 > n2)
{ {
// shrinks // shrinks
std::copy(s1, s2, i1); std::copy(s1, s2, i1);
erase(i1 + n2, i2); erase(i1 + n2, i2);
} }
else else
{ {
// grows // grows
flex_string_details::copy_n(s1, n1, i1); flex_string_details::copy_n(s1, n1, i1);
std::advance(s1, n1); std::advance(s1, n1);
insert(i2, s1, s2); insert(i2, s1, s2);
} }
} }
template <class InputIterator> template <class InputIterator>
void ReplaceImpl(iterator i1, iterator i2, void ReplaceImpl(iterator i1, iterator i2,
InputIterator b, InputIterator e, std::input_iterator_tag) InputIterator b, InputIterator e, std::input_iterator_tag)
{ {
flex_string temp(begin(), i1); flex_string temp(begin(), i1);
temp.append(b, e).append(i2, end()); temp.append(b, e).append(i2, end());
swap(temp); swap(temp);
} }
public: public:
@ -845,11 +845,11 @@ public:
flex_string& replace(iterator i1, iterator i2, flex_string& replace(iterator i1, iterator i2,
T1 first_or_n_or_s, T2 last_or_c_or_n) T1 first_or_n_or_s, T2 last_or_c_or_n)
{ {
const bool const bool
num1 = std::numeric_limits<T1>::is_specialized, num1 = std::numeric_limits<T1>::is_specialized,
num2 = std::numeric_limits<T2>::is_specialized; num2 = std::numeric_limits<T2>::is_specialized;
return ReplaceImplDiscr(i1, i2, first_or_n_or_s, last_or_c_or_n, return ReplaceImplDiscr(i1, i2, first_or_n_or_s, last_or_c_or_n,
Selector<num1 ? (num2 ? 1 : -1) : (num2 ? 2 : 0)>()); Selector<num1 ? (num2 ? 1 : -1) : (num2 ? 2 : 0)>());
} }
size_type copy(value_type* s, size_type n, size_type pos = 0) const size_type copy(value_type* s, size_type n, size_type pos = 0) const
@ -1051,36 +1051,36 @@ public:
} }
int compare(const flex_string& str) const int compare(const flex_string& str) const
{ {
// FIX due to Goncalo N M de Carvalho July 18, 2005 // FIX due to Goncalo N M de Carvalho July 18, 2005
return compare(0, size(), str); return compare(0, size(), str);
} }
int compare(size_type pos1, size_type n1, int compare(size_type pos1, size_type n1,
const flex_string& str) const const flex_string& str) const
{ return compare(pos1, n1, str.data(), str.size()); } { return compare(pos1, n1, str.data(), str.size()); }
// FIX to compare: added the TC // FIX to compare: added the TC
// (http://www.comeaucomputing.com/iso/lwg-defects.html number 5) // (http://www.comeaucomputing.com/iso/lwg-defects.html number 5)
// Thanks to Caleb Epstein for the fix // Thanks to Caleb Epstein for the fix
int compare(size_type pos1, size_type n1, int compare(size_type pos1, size_type n1,
const value_type* s) const const value_type* s) const
{ {
return compare(pos1, n1, s, traits_type::length(s)); return compare(pos1, n1, s, traits_type::length(s));
} }
int compare(size_type pos1, size_type n1, int compare(size_type pos1, size_type n1,
const value_type* s, size_type n2) const const value_type* s, size_type n2) const
{ {
Enforce(pos1 <= size(), static_cast<std::out_of_range*>(0), ""); Enforce(pos1 <= size(), static_cast<std::out_of_range*>(0), "");
Procust(n1, size() - pos1); Procust(n1, size() - pos1);
const int r = traits_type::compare(data(), s, Min(n1, n2)); const int r = traits_type::compare(data(), s, Min(n1, n2));
return return
r != 0 ? r : r != 0 ? r :
n1 > n2 ? 1 : n1 > n2 ? 1 :
n1 < n2 ? -1 : n1 < n2 ? -1 :
0; 0;
} }
int compare(size_type pos1, size_type n1, int compare(size_type pos1, size_type n1,
@ -1092,9 +1092,9 @@ public:
} }
int compare(const value_type* s) const int compare(const value_type* s) const
{ {
return traits_type::compare(data(), s, traits_type::length(s)); return traits_type::compare(data(), s, traits_type::length(s));
} }
}; };
// non-member functions // non-member functions
@ -1255,7 +1255,7 @@ std::basic_istream<typename flex_string<E, T, A, S>::value_type,
typename flex_string<E, T, A, S>::traits_type>& typename flex_string<E, T, A, S>::traits_type>&
operator>>( operator>>(
std::basic_istream<typename flex_string<E, T, A, S>::value_type, std::basic_istream<typename flex_string<E, T, A, S>::value_type,
typename flex_string<E, T, A, S>::traits_type>& is, typename flex_string<E, T, A, S>::traits_type>& is,
flex_string<E, T, A, S>& str); flex_string<E, T, A, S>& str);
template <typename E, class T, class A, class S> template <typename E, class T, class A, class S>
@ -1263,7 +1263,7 @@ std::basic_ostream<typename flex_string<E, T, A, S>::value_type,
typename flex_string<E, T, A, S>::traits_type>& typename flex_string<E, T, A, S>::traits_type>&
operator<<( operator<<(
std::basic_ostream<typename flex_string<E, T, A, S>::value_type, std::basic_ostream<typename flex_string<E, T, A, S>::value_type,
typename flex_string<E, T, A, S>::traits_type>& os, typename flex_string<E, T, A, S>::traits_type>& os,
const flex_string<E, T, A, S>& str) const flex_string<E, T, A, S>& str)
{ return os << str.c_str(); } { return os << str.c_str(); }

View file

@ -219,14 +219,14 @@ public:
template <class InputIterator> template <class InputIterator>
void append(InputIterator b, InputIterator e) void append(InputIterator b, InputIterator e)
{ {
const size_type const size_type
sz = std::distance(b, e), sz = std::distance(b, e),
neededCapacity = size() + sz; neededCapacity = size() + sz;
if (capacity() < neededCapacity) if (capacity() < neededCapacity)
{ {
static std::less_equal<const E*> le; static std::less_equal<const E*> le;
(void) le; (void) le;
assert(!(le(begin(), &*b) && le(&*b, end()))); // no aliasing assert(!(le(begin(), &*b) && le(&*b, end()))); // no aliasing
reserve(neededCapacity); reserve(neededCapacity);
} }
std::copy(b, e, end()); std::copy(b, e, end());
@ -274,7 +274,7 @@ SimpleStringStorage<E, A>::emptyString_;
//{ //{
// const_cast<E*>(SimpleStringStorage<E, A>::emptyString_.buffer_), // const_cast<E*>(SimpleStringStorage<E, A>::emptyString_.buffer_),
// const_cast<E*>(SimpleStringStorage<E, A>::emptyString_.buffer_), // const_cast<E*>(SimpleStringStorage<E, A>::emptyString_.buffer_),
// { E() } // { E() }
//}; //};

View file

@ -97,7 +97,7 @@ private:
public: public:
enum { maxSmallString = enum { maxSmallString =
(temp2 + sizeof(value_type) - 1) / sizeof(value_type) }; (temp2 + sizeof(value_type) - 1) / sizeof(value_type) };
private: private:
enum { magic = maxSmallString + 1 }; enum { magic = maxSmallString + 1 };
@ -260,14 +260,14 @@ public:
else else
{ {
// append to a small string // append to a small string
const size_type const size_type
sz = std::distance(b, e), sz = std::distance(b, e),
neededCapacity = maxSmallString - buf_[maxSmallString] + sz; neededCapacity = maxSmallString - buf_[maxSmallString] + sz;
if (maxSmallString < neededCapacity) if (maxSmallString < neededCapacity)
{ {
// need to change storage strategy // need to change storage strategy
allocator_type alloc; allocator_type alloc;
Storage temp(alloc); Storage temp(alloc);
temp.reserve(neededCapacity); temp.reserve(neededCapacity);
temp.append(buf_, buf_ + maxSmallString - buf_[maxSmallString]); temp.append(buf_, buf_ + maxSmallString - buf_[maxSmallString]);
@ -278,7 +278,7 @@ public:
} }
else else
{ {
std::copy(b, e, buf_ + maxSmallString - buf_[maxSmallString]); std::copy(b, e, buf_ + maxSmallString - buf_[maxSmallString]);
buf_[maxSmallString] = buf_[maxSmallString] - value_type(sz); buf_[maxSmallString] = buf_[maxSmallString] - value_type(sz);
} }
} }

View file

@ -137,32 +137,32 @@ public: // protected:
void reserve(size_type res_arg) void reserve(size_type res_arg)
{ {
assert(res_arg < max_size()); assert(res_arg < max_size());
base::reserve(res_arg + 1); base::reserve(res_arg + 1);
} }
template <class ForwardIterator> template <class ForwardIterator>
void append(ForwardIterator b, ForwardIterator e) void append(ForwardIterator b, ForwardIterator e)
{ {
const typename std::iterator_traits<ForwardIterator>::difference_type const typename std::iterator_traits<ForwardIterator>::difference_type
sz = std::distance(b, e); sz = std::distance(b, e);
assert(sz >= 0); assert(sz >= 0);
if (sz == 0) return; if (sz == 0) return;
base::reserve(base::size() + sz); base::reserve(base::size() + sz);
const value_type & v = *b; const value_type & v = *b;
struct OnBlockExit struct OnBlockExit
{ {
VectorStringStorage * that; VectorStringStorage * that;
~OnBlockExit() ~OnBlockExit()
{ {
that->base::push_back(value_type()); that->base::push_back(value_type());
} }
} onBlockExit = { this }; } onBlockExit = { this };
(void) onBlockExit; (void) onBlockExit;
assert(!base::empty()); assert(!base::empty());
assert(base::back() == value_type()); assert(base::back() == value_type());
base::back() = v; base::back() = v;
base::insert(base::end(), ++b, e); base::insert(base::end(), ++b, e);
} }
void resize(size_type n, E c) void resize(size_type n, E c)

View file

@ -10,10 +10,10 @@ namespace yasli_nstd
class fill_iterator_base class fill_iterator_base
: public std::iterator< : public std::iterator<
std::random_access_iterator_tag, std::random_access_iterator_tag,
T, T,
ptrdiff_t, ptrdiff_t,
T*, T*,
T&> T&>
{ {
}; };
@ -21,112 +21,112 @@ namespace yasli_nstd
class fill_iterator_base<T&> class fill_iterator_base<T&>
: public std::iterator< : public std::iterator<
std::random_access_iterator_tag, std::random_access_iterator_tag,
T, T,
ptrdiff_t, ptrdiff_t,
T*, T*,
T&> T&>
{ {
}; };
template <class T> template <class T>
class fill_iterator : public fill_iterator_base<T> class fill_iterator : public fill_iterator_base<T>
{ {
T value_; T value_;
/*difference_type*/ ptrdiff_t count_;////////////////////////////////// /*difference_type*/ ptrdiff_t count_;//////////////////////////////////
public: public:
typedef std::ptrdiff_t difference_type; typedef std::ptrdiff_t difference_type;
typedef typename fill_iterator_base<T>::pointer pointer; typedef typename fill_iterator_base<T>::pointer pointer;
typedef typename fill_iterator_base<T>::reference reference; typedef typename fill_iterator_base<T>::reference reference;
//typedef iterator_type; //typedef iterator_type;
fill_iterator() fill_iterator()
{
}
explicit fill_iterator(reference value, difference_type count = 0)
: value_(value), count_(count)
{
}
template<class U>
fill_iterator(const fill_iterator<U>& rhs)
: value_(rhs.value_), count_(rhs.count_)
{
}
reference operator*() const
{
return value_;
}
pointer operator->() const
{ {
return &**this; }
}
fill_iterator& operator++() explicit fill_iterator(reference value, difference_type count = 0)
{ : value_(value), count_(count)
{
}
template<class U>
fill_iterator(const fill_iterator<U>& rhs)
: value_(rhs.value_), count_(rhs.count_)
{
}
reference operator*() const
{
return value_;
}
pointer operator->() const
{
return &**this;
}
fill_iterator& operator++()
{
++count_; ++count_;
return *this; return *this;
} }
fill_iterator operator++(int) fill_iterator operator++(int)
{ {
fill_iterator it(*this); fill_iterator it(*this);
++*this; ++*this;
return it; return it;
} }
fill_iterator& operator--() fill_iterator& operator--()
{
--count_;
return *this;
}
fill_iterator operator--(int)
{ {
fill_iterator it(*this); --count_;
--*this; return *this;
return it;
} }
fill_iterator& operator+=(difference_type d) fill_iterator operator--(int)
{ {
count_ += d; fill_iterator it(*this);
return *this; --*this;
} return it;
}
fill_iterator operator+(difference_type d) const fill_iterator& operator+=(difference_type d)
{ {
return fill_iterator(*this) += d; count_ += d;
} return *this;
}
fill_iterator& operator-=(difference_type d) fill_iterator operator+(difference_type d) const
{ {
count_ -= d; return fill_iterator(*this) += d;
return *this; }
}
fill_iterator operator-(difference_type d) const fill_iterator& operator-=(difference_type d)
{ {
return fill_iterator(*this) -= d; count_ -= d;
} return *this;
}
fill_iterator operator-(difference_type d) const
{
return fill_iterator(*this) -= d;
}
difference_type operator-(const fill_iterator<T>& rhs) const difference_type operator-(const fill_iterator<T>& rhs) const
{ {
return count_ - rhs.count_; return count_ - rhs.count_;
} }
reference operator[](difference_type) const reference operator[](difference_type) const
{ {
return **this; return **this;
} }
template <class T2> template <class T2>
bool operator==(const fill_iterator<T2>& rhs) const bool operator==(const fill_iterator<T2>& rhs) const
{ {
return count_ == rhs.count_; return count_ == rhs.count_;
} }
}; };
@ -134,21 +134,21 @@ namespace yasli_nstd
template <class T, class D> template <class T, class D>
inline fill_iterator<T> operator+(D lhs, const fill_iterator<T>& rhs) inline fill_iterator<T> operator+(D lhs, const fill_iterator<T>& rhs)
{ {
return rhs + lhs; return rhs + lhs;
} }
template <class T> template <class T>
inline bool operator!=( inline bool operator!=(
const fill_iterator<T>& lhs, const fill_iterator<T>& lhs,
const fill_iterator<T>& rhs) const fill_iterator<T>& rhs)
{ // test for fill_iterator inequality { // test for fill_iterator inequality
return !(lhs == rhs); return !(lhs == rhs);
} }
template <class T> template <class T>
inline bool operator<( inline bool operator<(
const fill_iterator<T>& lhs, const fill_iterator<T>& lhs,
const fill_iterator<T>& rhs) const fill_iterator<T>& rhs)
{ {
return lhs.count_ < rhs.count_; return lhs.count_ < rhs.count_;
} }
@ -156,7 +156,7 @@ namespace yasli_nstd
template <class T> template <class T>
inline bool operator>( inline bool operator>(
const fill_iterator<T>& lhs, const fill_iterator<T>& lhs,
const fill_iterator<T>& rhs) const fill_iterator<T>& rhs)
{ {
return rhs < lhs; return rhs < lhs;
} }
@ -164,7 +164,7 @@ namespace yasli_nstd
template <class T> template <class T>
inline bool operator<=( inline bool operator<=(
const fill_iterator<T>& lhs, const fill_iterator<T>& lhs,
const fill_iterator<T>& rhs) const fill_iterator<T>& rhs)
{ {
return !(rhs < lhs); return !(rhs < lhs);
} }

View file

@ -316,13 +316,13 @@ namespace yasli {
} }
const_reference at(size_type n) const const_reference at(size_type n) const
{ {
// Fix by Joseph Canedo // Fix by Joseph Canedo
if (n >= size()) throw std::range_error("vector<>::at"); if (n >= size()) throw std::range_error("vector<>::at");
return ebo_.beg_[n]; return ebo_.beg_[n];
} }
reference at(size_type n) reference at(size_type n)
{ {
// Fix by Joseph Canedo // Fix by Joseph Canedo
if (n >= size()) throw std::range_error("vector<>::at"); if (n >= size()) throw std::range_error("vector<>::at");
return ebo_.beg_[n]; return ebo_.beg_[n];
} }

View file

@ -102,7 +102,7 @@ typedef std::auto_ptr<ImplT<E> > StdAutoPtr;
// Pimpl // Pimpl
typedef Pimpl<ImplT<E> > Pimpl1; typedef Pimpl<ImplT<E> > Pimpl1;
typedef Pimpl<ImplT<E>, CPropPtr> Pimpl2; typedef Pimpl<ImplT<E>, CPropPtr> Pimpl2;
typedef Pimpl<ImplT<E>, LokiPtr> Pimpl3; typedef Pimpl<ImplT<E>, LokiPtr> Pimpl3;
typedef Pimpl<ImplT<E>, BoostPtr> Pimpl4; typedef Pimpl<ImplT<E>, BoostPtr> Pimpl4;
@ -117,7 +117,7 @@ struct P5 {Pimpl5 d; P5();void f();void f()const;};
// PimplOwner // PimplOwner
typedef PimplOwner<ImplT<E> > PimplOwner1; typedef PimplOwner<ImplT<E> > PimplOwner1;
typedef PimplOwner<ImplT<E>, CPropPtr> PimplOwner2; typedef PimplOwner<ImplT<E>, CPropPtr> PimplOwner2;
typedef PimplOwner<ImplT<E>, LokiPtr> PimplOwner3; typedef PimplOwner<ImplT<E>, LokiPtr> PimplOwner3;
typedef PimplOwner<ImplT<E>, BoostPtr> PimplOwner4; typedef PimplOwner<ImplT<E>, BoostPtr> PimplOwner4;

View file

@ -26,7 +26,7 @@ class A2
{ {
public: public:
A2(); A2();
~A2(); ~A2();
void foo(); void foo();
private: private:
@ -42,7 +42,7 @@ class B2 : private PimplT<B2>::Owner
{ {
public: public:
B2(); B2();
~B2(); ~B2();
void foo(); void foo();
}; };
@ -56,7 +56,7 @@ class C2
{ {
public: public:
C2(); C2();
~C2(); ~C2();
void foo(); void foo();
private: private:
@ -73,7 +73,7 @@ class D2 : private RimplT<D2>::Owner
{ {
public: public:
D2(); D2();
~D2(); ~D2();
void foo(); void foo();
}; };
@ -94,7 +94,7 @@ class Incomplete2
{ {
public: public:
Incomplete2(); Incomplete2();
~Incomplete2(); ~Incomplete2();
void foo(); void foo();
private: private:
PimplT<Incomplete2>::Type d; PimplT<Incomplete2>::Type d;
@ -108,10 +108,10 @@ class Incomplete3
{ {
public: public:
Incomplete3(); Incomplete3();
~Incomplete3() ~Incomplete3()
{ {
// inline destructor // inline destructor
} }
void foo(); void foo();
private: private:
PimplT<Incomplete3>::Type d; PimplT<Incomplete3>::Type d;

View file

@ -37,24 +37,24 @@ Base* createBoo(){ return new Boo; }
namespace Loki namespace Loki
{ {
template<> bool RegisterFunction<Foo>() template<> bool RegisterFunction<Foo>()
{ {
std::cout << "RegisterFunction<Foo>\n"; std::cout << "RegisterFunction<Foo>\n";
return registerClass("Foo", &createFoo); return registerClass("Foo", &createFoo);
} }
template<> bool RegisterFunction<Boo>() template<> bool RegisterFunction<Boo>()
{ {
std::cout << "RegisterFunction<Boo>\n"; std::cout << "RegisterFunction<Boo>\n";
return registerClass("Boo", &createBoo); return registerClass("Boo", &createBoo);
} }
template<> bool UnRegisterFunction<Foo>() template<> bool UnRegisterFunction<Foo>()
{ {
std::cout << "UnRegisterFunction<Foo>\n"; std::cout << "UnRegisterFunction<Foo>\n";
return true; return true;
} }
template<> bool UnRegisterFunction<Boo>() template<> bool UnRegisterFunction<Boo>()
{ {
std::cout << "UnRegisterFunction<Boo>\n"; std::cout << "UnRegisterFunction<Boo>\n";
return true; return true;
} }
} }

View file

@ -15,8 +15,8 @@
#include <loki/LokiExport.h> #include <loki/LokiExport.h>
#if (defined(FOO_MAKE_DLL) && defined(FOO_DLL)) || \ #if (defined(FOO_MAKE_DLL) && defined(FOO_DLL)) || \
(defined(FOO_MAKE_DLL) && defined(FOO_STATIC)) || \ (defined(FOO_MAKE_DLL) && defined(FOO_STATIC)) || \
(defined(FOO_DLL) && defined(FOO_STATIC)) (defined(FOO_DLL) && defined(FOO_STATIC))
#error export macro error: you could not build AND use the library #error export macro error: you could not build AND use the library
#endif #endif

View file

@ -15,8 +15,8 @@
#include <loki/LokiExport.h> #include <loki/LokiExport.h>
#if (defined(SINGLETONDLL_MAKE_DLL) && defined(SINGLETONDLL_DLL)) || \ #if (defined(SINGLETONDLL_MAKE_DLL) && defined(SINGLETONDLL_DLL)) || \
(defined(SINGLETONDLL_MAKE_DLL) && defined(SINGLETONDLL_STATIC)) || \ (defined(SINGLETONDLL_MAKE_DLL) && defined(SINGLETONDLL_STATIC)) || \
(defined(SINGLETONDLL_DLL) && defined(SINGLETONDLL_STATIC)) (defined(SINGLETONDLL_DLL) && defined(SINGLETONDLL_STATIC))
#error export macro error: you could not build AND use the library #error export macro error: you could not build AND use the library
#endif #endif