Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6554 serge 1
// nonstandard construct and destroy functions -*- C++ -*-
2
 
3
// Copyright (C) 2001-2015 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 3, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// .
24
 
25
/*
26
 *
27
 * Copyright (c) 1994
28
 * Hewlett-Packard Company
29
 *
30
 * Permission to use, copy, modify, distribute and sell this software
31
 * and its documentation for any purpose is hereby granted without fee,
32
 * provided that the above copyright notice appear in all copies and
33
 * that both that copyright notice and this permission notice appear
34
 * in supporting documentation.  Hewlett-Packard Company makes no
35
 * representations about the suitability of this software for any
36
 * purpose.  It is provided "as is" without express or implied warranty.
37
 *
38
 *
39
 * Copyright (c) 1996,1997
40
 * Silicon Graphics Computer Systems, Inc.
41
 *
42
 * Permission to use, copy, modify, distribute and sell this software
43
 * and its documentation for any purpose is hereby granted without fee,
44
 * provided that the above copyright notice appear in all copies and
45
 * that both that copyright notice and this permission notice appear
46
 * in supporting documentation.  Silicon Graphics makes no
47
 * representations about the suitability of this software for any
48
 * purpose.  It is provided "as is" without express or implied warranty.
49
 */
50
 
51
/** @file bits/stl_construct.h
52
 *  This is an internal header file, included by other library headers.
53
 *  Do not attempt to use it directly. @headername{memory}
54
 */
55
 
56
#ifndef _STL_CONSTRUCT_H
57
#define _STL_CONSTRUCT_H 1
58
 
59
#include 
60
#include 
61
#include 
62
 
63
namespace std _GLIBCXX_VISIBILITY(default)
64
{
65
_GLIBCXX_BEGIN_NAMESPACE_VERSION
66
 
67
  /**
68
   * Constructs an object in existing memory by invoking an allocated
69
   * object's constructor with an initializer.
70
   */
71
#if __cplusplus >= 201103L
72
  template
73
    inline void
74
    _Construct(_T1* __p, _Args&&... __args)
75
    { ::new(static_cast(__p)) _T1(std::forward<_Args>(__args)...); }
76
#else
77
  template
78
    inline void
79
    _Construct(_T1* __p, const _T2& __value)
80
    {
81
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
82
      // 402. wrong new expression in [some_]allocator::construct
83
      ::new(static_cast(__p)) _T1(__value);
84
    }
85
#endif
86
 
87
  /**
88
   * Destroy the object pointed to by a pointer type.
89
   */
90
  template
91
    inline void
92
    _Destroy(_Tp* __pointer)
93
    { __pointer->~_Tp(); }
94
 
95
  template
96
    struct _Destroy_aux
97
    {
98
      template
99
        static void
100
        __destroy(_ForwardIterator __first, _ForwardIterator __last)
101
	{
102
	  for (; __first != __last; ++__first)
103
	    std::_Destroy(std::__addressof(*__first));
104
	}
105
    };
106
 
107
  template<>
108
    struct _Destroy_aux
109
    {
110
      template
111
        static void
112
        __destroy(_ForwardIterator, _ForwardIterator) { }
113
    };
114
 
115
  /**
116
   * Destroy a range of objects.  If the value_type of the object has
117
   * a trivial destructor, the compiler should optimize all of this
118
   * away, otherwise the objects' destructors must be invoked.
119
   */
120
  template
121
    inline void
122
    _Destroy(_ForwardIterator __first, _ForwardIterator __last)
123
    {
124
      typedef typename iterator_traits<_ForwardIterator>::value_type
125
                       _Value_type;
126
      std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
127
	__destroy(__first, __last);
128
    }
129
 
130
  /**
131
   * Destroy a range of objects using the supplied allocator.  For
132
   * nondefault allocators we do not optimize away invocation of
133
   * destroy() even if _Tp has a trivial destructor.
134
   */
135
 
136
  template
137
    void
138
    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
139
	     _Allocator& __alloc)
140
    {
141
      typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
142
      for (; __first != __last; ++__first)
143
	__traits::destroy(__alloc, std::__addressof(*__first));
144
    }
145
 
146
  template
147
    inline void
148
    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
149
	     allocator<_Tp>&)
150
    {
151
      _Destroy(__first, __last);
152
    }
153
 
154
_GLIBCXX_END_NAMESPACE_VERSION
155
} // namespace std
156
 
157
#endif /* _STL_CONSTRUCT_H */
158