/*
 * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
 *
 * Copyright (c) 1999
 * Silicon Graphics Computer Systems, Inc.
 *
 * Copyright (c) 1999
 * Boris Fomitchev
 *
 * This material is provided "as is", with absolutely no warranty expressed
 * or implied. Any use is at your own risk.
 *
 * Permission to use or copy this software for any purpose is hereby granted
 * without fee, provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 *
 */

# ifndef LOCALE_IMPL_H
#  define  LOCALE_IMPL_H

#include <clocale>             // C locale header file.
#include <vector>
#include <string>
#include <stl/_locale.h>
#include "c_locale.h"

_STLP_BEGIN_NAMESPACE

//----------------------------------------------------------------------
// Class _Locale_impl
// This is the base class which implements access only and is supposed to
// be used for classic locale only
class _STLP_CLASS_DECLSPEC _Locale_impl
{
public:
  _Locale_impl(const char* s);
  //  _Locale_impl(const _Locale_impl&);
  virtual ~_Locale_impl();

  virtual void incr();
  virtual void decr();

  size_t size() const { return _M_size; }

  static _Locale_impl* make_classic_locale();

  locale::facet** facets;
  size_t _M_size;

  basic_string<char, char_traits<char>, allocator<char> > name;

  static void _STLP_CALL _M_throw_bad_cast();

 public:
#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_)
  static _Locale_impl*&  get_locale_impl_S_global_impl();
  //  static locale          _S_classic;
  static _STLP_STATIC_MUTEX& get_locale_impl_S_global_locale_lock();
# else
  static _Locale_impl*   _S_global_impl;
  //  static locale          _S_classic;
  static _STLP_STATIC_MUTEX _S_global_locale_lock;
# endif
private:
  void operator=(const _Locale_impl&);
};

inline _Locale_impl*  _STLP_CALL _S_copy_impl(_Locale_impl* I) {
    _STLP_ASSERT( I != 0 );
    I->incr();
    return I;
}

_STLP_END_NAMESPACE

#endif


