Skip to content

Commit

Permalink
shared_ptr: Make shared_ptr work with foreign_ptr
Browse files Browse the repository at this point in the history
The foreign_ptr wrapper needs 'element_type' to be present in
shared_ptr to be able to access the data.

Fixes the following compilation failure when trying to use shared_ptr
with foreign_ptr:

  In file included from tests/foreign_ptr_test.cc:24:0:
  ./core/distributed.hh: In instantiation of ‘class foreign_ptr<shared_ptr<basic_sstring<char, unsigned int, 15u> > >’:
  tests/foreign_ptr_test.cc:28:54:   required from here
  ./core/distributed.hh:272:56: error: no type named ‘element_type’ in ‘class shared_ptr<basic_sstring<char, unsigned int, 15u> >’
       using element_type = typename PtrType::element_type;

Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
  • Loading branch information
Pekka Enberg authored and avikivity committed Apr 27, 2015
1 parent 3f3987e commit 066a37a
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
2 changes: 2 additions & 0 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ def debug_flag(compiler):
'tests/timertest',
'tests/tcp_test',
'tests/futures_test',
'tests/foreign_ptr_test',
'tests/smp_test',
'tests/udp_server',
'tests/udp_client',
Expand Down Expand Up @@ -282,6 +283,7 @@ def have_xen():
'tests/tcp_test': ['tests/tcp_test.cc'] + core + libnet,
'tests/timertest': ['tests/timertest.cc'] + core,
'tests/futures_test': ['tests/futures_test.cc'] + core + boost_test_lib,
'tests/foreign_ptr_test': ['tests/foreign_ptr_test.cc'] + core + boost_test_lib,
'tests/smp_test': ['tests/smp_test.cc'] + core,
'tests/udp_server': ['tests/udp_server.cc'] + core + libnet,
'tests/udp_client': ['tests/udp_client.cc'] + core + libnet,
Expand Down
2 changes: 2 additions & 0 deletions core/shared_ptr.hh
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,8 @@ private:
}
}
public:
using element_type = T;

shared_ptr() noexcept = default;
shared_ptr(std::nullptr_t) noexcept : shared_ptr() {}
shared_ptr(const shared_ptr& x) noexcept
Expand Down
35 changes: 35 additions & 0 deletions tests/foreign_ptr_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* This file is open source software, licensed to you under the terms
* of the Apache License, Version 2.0 (the "License"). See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. 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 (C) 2015 Cloudius Systems, Ltd.
*/

#include "tests/test-utils.hh"

#include "core/distributed.hh"
#include "core/shared_ptr.hh"

BOOST_AUTO_TEST_CASE(make_foreign_ptr_from_lw_shared_ptr) {
auto p = make_foreign(make_lw_shared<sstring>("foo"));
BOOST_REQUIRE(p->size() == 3);
}

BOOST_AUTO_TEST_CASE(make_foreign_ptr_from_shared_ptr) {
auto p = make_foreign(make_shared<sstring>("foo"));
BOOST_REQUIRE(p->size() == 3);
}

0 comments on commit 066a37a

Please sign in to comment.