Skip to content

Commit

Permalink
move thunk into its own header
Browse files Browse the repository at this point in the history
Reviewed By: vitaut

Differential Revision: D27036041

fbshipit-source-id: 038b35b9690f17b59425c13c57176ac7dd017ea5
  • Loading branch information
yfeldblum authored and facebook-github-bot committed Mar 19, 2021
1 parent 59dcfc1 commit 163f3c3
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 35 deletions.
1 change: 1 addition & 0 deletions folly/Memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <folly/functional/Invoke.h>
#include <folly/lang/Align.h>
#include <folly/lang/Exception.h>
#include <folly/lang/Thunk.h>
#include <folly/memory/Malloc.h>
#include <folly/portability/Config.h>
#include <folly/portability/Malloc.h>
Expand Down
35 changes: 0 additions & 35 deletions folly/Utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -415,39 +415,4 @@ T declval() noexcept;
#define FOLLY_DECLVAL(...) ::folly::detail::declval<__VA_ARGS__>()
#endif

namespace detail {

// thunk
//
// A carefully curated collection of generic general-purpose thunk templates:
// * make: operator new with given arguments
// * ruin: operator delete
// * ctor: in-place constructor with given arguments
// * dtor: in-place destructor
// * noop: no-op function with the given arguments
struct thunk {
template <typename T, typename... A>
static void* make(A... a) {
return new T(static_cast<A>(a)...);
}
template <typename T>
static void ruin(void* const ptr) noexcept {
delete static_cast<T*>(ptr);
}

template <typename T, typename... A>
static void ctor(void* const ptr, A... a) {
::new (ptr) T(static_cast<A>(a)...);
}
template <typename T>
static void dtor(void* const ptr) noexcept {
static_cast<T*>(ptr)->~T();
}

template <typename... T>
static void noop(T...) noexcept {}
};

} // namespace detail

} // namespace folly
1 change: 1 addition & 0 deletions folly/detail/StaticSingletonManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <folly/Likely.h>
#include <folly/Utility.h>
#include <folly/detail/Singleton.h>
#include <folly/lang/Thunk.h>
#include <folly/lang/TypeInfo.h>

namespace folly {
Expand Down
1 change: 1 addition & 0 deletions folly/io/async/EventBaseLocal.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <folly/Likely.h>
#include <folly/Synchronized.h>
#include <folly/io/async/EventBase.h>
#include <folly/lang/Thunk.h>

namespace folly {

Expand Down
54 changes: 54 additions & 0 deletions folly/lang/Thunk.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* Licensed 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.
*/

#pragma once

namespace folly {
namespace detail {

// thunk
//
// A carefully curated collection of generic general-purpose thunk templates:
// * make: operator new with given arguments
// * ruin: operator delete
// * ctor: in-place constructor with given arguments
// * dtor: in-place destructor
// * noop: no-op function with the given arguments
struct thunk {
template <typename T, typename... A>
static void* make(A... a) {
return new T(static_cast<A>(a)...);
}
template <typename T>
static void ruin(void* const ptr) noexcept {
delete static_cast<T*>(ptr);
}

template <typename T, typename... A>
static void ctor(void* const ptr, A... a) {
::new (ptr) T(static_cast<A>(a)...);
}
template <typename T>
static void dtor(void* const ptr) noexcept {
static_cast<T*>(ptr)->~T();
}

template <typename... T>
static void noop(T...) noexcept {}
};

} // namespace detail
} // namespace folly

0 comments on commit 163f3c3

Please sign in to comment.