Skip to content

Commit 860f7fc

Browse files
committed
Ported #962 to C++.
Improved alignment calculation logic. Fixed test for zone. Now, align parameter must be 2^n (n >=0). e.g. 1,2,4,8,16, ...
1 parent 76f5af0 commit 860f7fc

File tree

5 files changed

+37
-9
lines changed

5 files changed

+37
-9
lines changed

erb/v1/cpp03_zone.hpp.erb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@
1010
#ifndef MSGPACK_V1_CPP03_ZONE_HPP
1111
#define MSGPACK_V1_CPP03_ZONE_HPP
1212

13+
#include "msgpack/versioning.hpp"
14+
#include "msgpack/cpp_config.hpp"
1315
#include "msgpack/zone_decl.hpp"
1416

17+
#include <cstdlib>
18+
#include <memory>
19+
#include <vector>
20+
21+
#include <boost/assert.hpp>
22+
1523
<% GENERATION_LIMIT = 15 %>
1624
namespace msgpack {
1725

@@ -192,10 +200,11 @@ inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_
192200

193201
inline char* zone::get_aligned(char* ptr, size_t align)
194202
{
203+
BOOST_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0)
195204
return
196205
reinterpret_cast<char*>(
197-
reinterpret_cast<size_t>(
198-
(ptr + (align - 1))) / align * align);
206+
reinterpret_cast<uintptr_t>(ptr + (align - 1)) & ~static_cast<uintptr_t>(align - 1)
207+
);
199208
}
200209

201210
inline void* zone::allocate_align(size_t size, size_t align)

include/msgpack/sysdep.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@
2626
typedef unsigned __int32 uint32_t;
2727
typedef signed __int64 int64_t;
2828
typedef unsigned __int64 uint64_t;
29+
# if defined(_WIN64)
30+
typedef signed __int64 intptr_t;
31+
typedef unsigned __int64 uintptr_t;
32+
# else
33+
typedef signed __int32 intptr_t;
34+
typedef unsigned __int32 uintptr_t;
35+
# endif
2936
#elif defined(_MSC_VER) // && _MSC_VER >= 1600
3037
# include <stdint.h>
3138
#else

include/msgpack/v1/detail/cpp03_zone.hpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@
1010
#ifndef MSGPACK_V1_CPP03_ZONE_HPP
1111
#define MSGPACK_V1_CPP03_ZONE_HPP
1212

13+
#include "msgpack/versioning.hpp"
14+
#include "msgpack/cpp_config.hpp"
1315
#include "msgpack/zone_decl.hpp"
1416

17+
#include <cstdlib>
18+
#include <memory>
19+
#include <vector>
20+
21+
#include <boost/assert.hpp>
22+
1523

1624
namespace msgpack {
1725

@@ -237,10 +245,11 @@ inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_
237245

238246
inline char* zone::get_aligned(char* ptr, size_t align)
239247
{
248+
BOOST_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0)
240249
return
241250
reinterpret_cast<char*>(
242-
reinterpret_cast<size_t>(
243-
(ptr + (align - 1))) / align * align);
251+
reinterpret_cast<uintptr_t>(ptr + (align - 1)) & ~static_cast<uintptr_t>(align - 1)
252+
);
244253
}
245254

246255
inline void* zone::allocate_align(size_t size, size_t align)

include/msgpack/v1/detail/cpp11_zone.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include <memory>
1919
#include <vector>
2020

21+
#include <boost/assert.hpp>
22+
2123
namespace msgpack {
2224

2325
/// @cond
@@ -230,10 +232,11 @@ inline zone::zone(size_t chunk_size) noexcept:m_chunk_size(chunk_size), m_chunk_
230232

231233
inline char* zone::get_aligned(char* ptr, size_t align)
232234
{
235+
BOOST_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0)
233236
return
234237
reinterpret_cast<char*>(
235-
reinterpret_cast<size_t>(
236-
(ptr + (align - 1))) / align * align);
238+
reinterpret_cast<uintptr_t>(ptr + (align - 1)) & ~static_cast<uintptr_t>(align - 1)
239+
);
237240
}
238241

239242
inline void* zone::allocate_align(size_t size, size_t align)

test/zone.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ BOOST_AUTO_TEST_CASE(allocate_align)
88
msgpack::zone z;
99
char* start = (char*)z.allocate_align(1);
1010
BOOST_CHECK_EQUAL(0ul, reinterpret_cast<std::size_t>(start) % sizeof(int));
11-
for (std::size_t s = 1; s < sizeof(int); ++s) {
11+
for (std::size_t s = 1; s < sizeof(int); s <<= 1) {
1212
z.allocate_no_align(s);
1313
char* buf_a = (char*)z.allocate_align(1);
1414
BOOST_CHECK_EQUAL(0ul, reinterpret_cast<std::size_t>(buf_a) % sizeof(int));
@@ -18,10 +18,10 @@ BOOST_AUTO_TEST_CASE(allocate_align)
1818
BOOST_AUTO_TEST_CASE(allocate_align_custom)
1919
{
2020
msgpack::zone z;
21-
for (std::size_t align = 1; align < 64; ++align) {
21+
for (std::size_t align = 1; align < 64; align <<= 1) {
2222
char* start = (char*)z.allocate_align(1, align);
2323
BOOST_CHECK_EQUAL(0ul, reinterpret_cast<std::size_t>(start) % align);
24-
for (std::size_t s = 1; s < align; ++s) {
24+
for (std::size_t s = 1; s < align; s <<= 1) {
2525
z.allocate_no_align(s);
2626
char* buf_a = (char*)z.allocate_align(1, align);
2727
BOOST_CHECK_EQUAL(0ul, reinterpret_cast<std::size_t>(buf_a) % align);

0 commit comments

Comments
 (0)