| /*************************************************************************** |
| * |
| * use_facet.h |
| * |
| * This is an internal header file used to implement the C++ Standard |
| * Library. It should never be #included directly by a program. |
| * |
| * $Id$ |
| * |
| *************************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed |
| * with this work for additional information regarding copyright |
| * ownership. The ASF licenses this file to you under the Apache |
| * License, Version 2.0 (the "License"); you may not use this file |
| * except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| * implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| * |
| * Copyright 1994-2006 Rogue Wave Software. |
| * |
| **************************************************************************/ |
| |
| #ifndef _RWSTD_USE_FACET_H_INCLUDED |
| #define _RWSTD_USE_FACET_H_INCLUDED |
| |
| |
| #include <new> |
| #include <rw/_defs.h> |
| |
| #include "access.h" |
| #include "podarray.h" |
| |
| |
| // helper macro _RWSTD_DEFINE_FACET_FACTORY() defines a facet factory |
| // function called to construct, on demand, objects of specializations |
| // of facet class templates |
| // _byname facets are constructed on the heap while ordinary facets |
| // are constructed in static memory for efficiency and to avoid leaks, |
| // and are not destroyed during program lifetime |
| |
| #ifndef _RWSTD_NO_BYNAME_FACET |
| |
| // definition for facets that come in both forms, plain and _byname |
| # define _RWSTD_DEFINE_FACET_FACTORY(Linkage, Facet, TArgs, fid) \ |
| typedef _STD:: Facet TArgs __rw_ ## fid ## _facet; \ |
| _RWSTD_NAMESPACE (__rw) \ |
| { \ |
| Linkage __rw_facet* \ |
| __rw_ct_ ## fid (_RWSTD_SIZE_T ref, const char *name) \ |
| { \ |
| __rw_facet* pfacet; \ |
| if (name) { \ |
| /* construct a _byname facet on the heap */ \ |
| pfacet = new _STD:: Facet ## _byname TArgs (name, ref); \ |
| } \ |
| else { \ |
| /* construct an ordinary facet in static memory */ \ |
| static __rw_aligned_buffer<__rw_ ## fid ## _facet> f; \ |
| static __rw_facet* const pf = \ |
| new (f._C_store ()) __rw_ ## fid ## _facet (ref); \ |
| pfacet = pf; \ |
| } \ |
| /* set the pointer to the facet id */ \ |
| __rw_access::_C_get_pid (*pfacet) = \ |
| &(__rw_access::_C_get_id (__rw_ ## fid ## _facet::id)); \ |
| return pfacet; \ |
| } \ |
| } /* namespace __rw */ \ |
| typedef void __rw_unused_type |
| |
| #else // if defined (_RWSTD_NO_BYNAME_FACET) |
| |
| // definition for facets such as num_get that do not have a _byname form |
| # define _RWSTD_DEFINE_FACET_FACTORY(Linkage, Facet, TArgs, fid) \ |
| typedef _STD:: Facet TArgs __rw_ ## fid ## _facet; \ |
| _RWSTD_NAMESPACE (__rw) \ |
| { \ |
| Linkage __rw_facet* \ |
| __rw_ct_ ## fid (_RWSTD_SIZE_T ref, const char*) \ |
| { \ |
| /* construct an ordinary facet in static memory */ \ |
| static __rw_aligned_buffer<__rw_ ## fid ## _facet> f; \ |
| static __rw_facet* const pf = \ |
| new (f._C_store ()) __rw_ ## fid ## _facet (ref); \ |
| /* set the pointer to the facet id */ \ |
| __rw_access::_C_get_pid (*pf) = \ |
| &(__rw_access::_C_get_id (__rw_ ## fid ## _facet::id)); \ |
| return pf; \ |
| } \ |
| } /* namespace __rw */ \ |
| typedef void __rw_unused_type |
| |
| #endif // _RWSTD_NO_BYNAME_FACET |
| |
| |
| #ifndef _RWSTD_NO_SPECIALIZED_FACET_ID |
| // provide definitions of explicit specializations of static |
| // template data members to guarantee a single instance of |
| // each in a program when the compiler or linker don't |
| // (e.g., VisualAge C++ on AIX) |
| # define _RWSTD_SPECIALIZE_FACET_ID(Facet, TArgs) \ |
| _RWSTD_NAMESPACE (std) { \ |
| _RWSTD_SPECIALIZED_CLASS \ |
| _RW::__rw_facet_id Facet TArgs:: \ |
| id (_RW::__rw_facet_id::_C_Init); \ |
| } \ |
| typedef void __rw_unused_type |
| #else // if defined (_RWSTD_NO_SPECIALIZED_FACET_ID) |
| // facet id's will not be explicitly specialized |
| # define _RWSTD_SPECIALIZE_FACET_ID(ignore1, ignore2) \ |
| typedef void __rw_unused_type |
| #endif // _RWSTD_NO_SPECIALIZED_FACET_ID |
| |
| |
| #define _RWSTD_SPECIALIZE_USE_FACET(fid) \ |
| _RWSTD_NAMESPACE (__rw) { \ |
| _RWSTD_EXPORT \ |
| const __rw_facet* \ |
| __rw_get_facet_by_id \ |
| (const _STD::locale &__loc, \ |
| const __rw_facet_id&, \ |
| const __rw_ ## fid ## _facet*) { \ |
| return __rw_get_std_facet (__loc, __rw_facet::_C_ ## fid, \ |
| __rw_ct_ ## fid); \ |
| } \ |
| } \ |
| typedef void __rw_unused_type |
| |
| #endif // _RWSTD_USE_FACET_H_INCLUDED |