Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6554 serge 1
//  -*- 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
 * Copyright (c) 1997-1999
27
 * Silicon Graphics Computer Systems, Inc.
28
 *
29
 * Permission to use, copy, modify, distribute and sell this software
30
 * and its documentation for any purpose is hereby granted without fee,
31
 * provided that the above copyright notice appear in all copies and
32
 * that both that copyright notice and this permission notice appear
33
 * in supporting documentation.  Silicon Graphics makes no
34
 * representations about the suitability of this software for any
35
 * purpose.  It is provided "as is" without express or implied warranty.
36
 *
37
 */
38
 
39
/** @file include/memory
40
 *  This is a Standard C++ Library header.
41
 */
42
 
43
#ifndef _GLIBCXX_MEMORY
44
#define _GLIBCXX_MEMORY 1
45
 
46
#pragma GCC system_header
47
 
48
/**
49
 * @defgroup memory Memory
50
 * @ingroup utilities
51
 *
52
 * Components for memory allocation, deallocation, and management.
53
 */
54
 
55
/**
56
 * @defgroup pointer_abstractions Pointer Abstractions
57
 * @ingroup memory
58
 *
59
 * Smart pointers, etc.
60
 */
61
 
62
#include 
63
#include 
64
#include 
65
#include 
66
#include 
67
#include 
68
 
69
#if __cplusplus >= 201103L
70
#  include         	  // std::exception
71
#  include          	  // std::type_info in get_deleter
72
#  include            	  // std::basic_ostream
73
#  include 
74
#  include 
75
#  include 
76
#  include   // std::less
77
#  include 
78
#  include 
79
#  include 
80
#  include 
81
#  include 
82
#  include 
83
#  include 
84
#  if _GLIBCXX_USE_DEPRECATED
85
#    include 
86
#  endif
87
#else
88
#  include 
89
#endif
90
 
91
#if __cplusplus >= 201103L
92
#  include 
93
#  ifdef _GLIBCXX_USE_C99_STDINT_TR1
94
namespace std _GLIBCXX_VISIBILITY(default)
95
{
96
_GLIBCXX_BEGIN_NAMESPACE_VERSION
97
 
98
/**
99
 *  @brief Fit aligned storage in buffer.
100
 *
101
 *  [ptr.align]
102
 *
103
 *  This function tries to fit @a __size bytes of storage with alignment
104
 *  @a __align into the buffer @a __ptr of size @a __space bytes.  If such
105
 *  a buffer fits then @a __ptr is changed to point to the first byte of the
106
 *  aligned storage and @a __space is reduced by the bytes used for alignment.
107
 *
108
 *  @param __align   A fundamental or extended alignment value.
109
 *  @param __size    Size of the aligned storage required.
110
 *  @param __ptr     Pointer to a buffer of @a __space bytes.
111
 *  @param __space   Size of the buffer pointed to by @a __ptr.
112
 *  @return the updated pointer if the aligned storage fits, otherwise nullptr.
113
 */
114
inline void*
115
align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept
116
{
117
  const auto __intptr = reinterpret_cast(__ptr);
118
  const auto __aligned = (__intptr - 1u + __align) & -__align;
119
  const auto __diff = __aligned - __intptr;
120
  if ((__size + __diff) > __space)
121
    return nullptr;
122
  else
123
    {
124
      __space -= __diff;
125
      return __ptr = reinterpret_cast(__aligned);
126
    }
127
}
128
 
129
_GLIBCXX_END_NAMESPACE_VERSION
130
} // namespace
131
#endif // _GLIBCXX_USE_C99_STDINT_TR1
132
#endif // C++11
133
 
134
#endif /* _GLIBCXX_MEMORY */