|
- /* Copyright (c) 2015, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
- #ifndef OPENSSL_HEADER_CRYPTO_TEST_STL_COMPAT_H
- #define OPENSSL_HEADER_CRYPTO_TEST_STL_COMPAT_H
-
- #include <assert.h>
-
- #include <vector>
-
-
- // This header contains re-implementations of library functions from C++11. They
- // will be replaced with their standard counterparts once Chromium has C++11
- // library support in its toolchain.
-
- namespace bssl {
-
- // vector_data is a reimplementation of |std::vector::data| from C++11.
- template <class T>
- static T *vector_data(std::vector<T> *out) {
- return out->empty() ? nullptr : &(*out)[0];
- }
-
- template <class T>
- static const T *vector_data(const std::vector<T> *out) {
- return out->empty() ? nullptr : &(*out)[0];
- }
-
- // remove_reference is a reimplementation of |std::remove_reference| from C++11.
- template <class T>
- struct remove_reference {
- using type = T;
- };
-
- template <class T>
- struct remove_reference<T&> {
- using type = T;
- };
-
- template <class T>
- struct remove_reference<T&&> {
- using type = T;
- };
-
- // move is a reimplementation of |std::move| from C++11.
- template <class T>
- typename remove_reference<T>::type &&move(T &&t) {
- return static_cast<typename remove_reference<T>::type&&>(t);
- }
-
- // default_delete is a partial reimplementation of |std::default_delete| from
- // C++11.
- template <class T>
- struct default_delete {
- void operator()(T *t) const {
- enum { type_must_be_complete = sizeof(T) };
- delete t;
- }
- };
-
- // nullptr_t is |std::nullptr_t| from C++11.
- using nullptr_t = decltype(nullptr);
-
- // unique_ptr is a partial reimplementation of |std::unique_ptr| from C++11. It
- // intentionally does not support stateful deleters to avoid having to bother
- // with the empty member optimization.
- template <class T, class Deleter = default_delete<T>>
- class unique_ptr {
- public:
- unique_ptr() : ptr_(nullptr) {}
- unique_ptr(nullptr_t) : ptr_(nullptr) {}
- unique_ptr(T *ptr) : ptr_(ptr) {}
- unique_ptr(const unique_ptr &u) = delete;
-
- unique_ptr(unique_ptr &&u) : ptr_(nullptr) {
- reset(u.release());
- }
-
- ~unique_ptr() {
- reset();
- }
-
- unique_ptr &operator=(nullptr_t) {
- reset();
- return *this;
- }
-
- unique_ptr &operator=(unique_ptr &&u) {
- reset(u.release());
- return *this;
- }
-
- unique_ptr& operator=(const unique_ptr &u) = delete;
-
- explicit operator bool() const {
- return ptr_ != nullptr;
- }
-
- T &operator*() const {
- assert(ptr_ != nullptr);
- return *ptr_;
- }
-
- T *operator->() const {
- assert(ptr_ != nullptr);
- return ptr_;
- }
-
- T *get() const {
- return ptr_;
- }
-
- T *release() {
- T *ptr = ptr_;
- ptr_ = nullptr;
- return ptr;
- }
-
- void reset(T *ptr = nullptr) {
- if (ptr_ != nullptr) {
- Deleter()(ptr_);
- }
- ptr_ = ptr;
- }
-
- private:
- T *ptr_;
- };
-
- } // namespace bssl
-
-
- #endif // OPENSSL_HEADER_CRYPTO_TEST_STL_COMPAT_H
|