Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1179)

Unified Diff: mojo/edk/system/memory.h

Issue 814543006: Move //mojo/{public, edk} underneath //third_party (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/edk/system/mapping_table.cc ('k') | mojo/edk/system/memory.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/edk/system/memory.h
diff --git a/mojo/edk/system/memory.h b/mojo/edk/system/memory.h
deleted file mode 100644
index 96cf2199d00ca21d7d713139eed3c3f29afa6b53..0000000000000000000000000000000000000000
--- a/mojo/edk/system/memory.h
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_MEMORY_H_
-#define MOJO_EDK_SYSTEM_MEMORY_H_
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h> // For |memcpy()|.
-
-#include "base/macros.h"
-#include "base/memory/scoped_ptr.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/macros.h"
-
-namespace mojo {
-namespace system {
-
-namespace internal {
-
-// Removes |const| from |T| (available as |remove_const<T>::type|):
-// TODO(vtl): Remove these once we have the C++11 |remove_const|.
-template <typename T>
-struct remove_const {
- typedef T type;
-};
-template <typename T>
-struct remove_const<const T> {
- typedef T type;
-};
-
-// Yields |(const) char| if |T| is |(const) void|, else |T|:
-template <typename T>
-struct VoidToChar {
- typedef T type;
-};
-template <>
-struct VoidToChar<void> {
- typedef char type;
-};
-template <>
-struct VoidToChar<const void> {
- typedef const char type;
-};
-
-// Checks (insofar as appropriate/possible) that |pointer| is a valid pointer to
-// a buffer of the given size and alignment (both in bytes).
-template <size_t size, size_t alignment>
-void MOJO_SYSTEM_IMPL_EXPORT CheckUserPointer(const void* pointer);
-
-// Checks (insofar as appropriate/possible) that |pointer| is a valid pointer to
-// a buffer of |count| elements of the given size and alignment (both in bytes).
-template <size_t size, size_t alignment>
-void MOJO_SYSTEM_IMPL_EXPORT
-CheckUserPointerWithCount(const void* pointer, size_t count);
-
-// Checks (insofar as appropriate/possible) that |pointer| is a valid pointer to
-// a buffer of the given size and alignment (both in bytes).
-template <size_t alignment>
-void MOJO_SYSTEM_IMPL_EXPORT
-CheckUserPointerWithSize(const void* pointer, size_t size);
-
-} // namespace internal
-
-// Forward declarations so that they can be friended.
-template <typename Type>
-class UserPointerReader;
-template <typename Type>
-class UserPointerWriter;
-template <typename Type>
-class UserPointerReaderWriter;
-template <class Options>
-class UserOptionsReader;
-
-// Provides a convenient way to implicitly get null |UserPointer<Type>|s.
-struct NullUserPointer {};
-
-// Represents a user pointer to a single |Type| (which must be POD), for Mojo
-// primitive parameters.
-//
-// Use a const |Type| for in parameters, and non-const |Type|s for out and
-// in-out parameters (in which case the |Put()| method is available).
-template <typename Type>
-class UserPointer {
- private:
- typedef typename internal::VoidToChar<Type>::type NonVoidType;
-
- public:
- // Instead of explicitly using these constructors, you can often use
- // |MakeUserPointer()| (or |NullUserPointer()| for null pointers). (The common
- // exception is when you have, e.g., a |char*| and want to get a
- // |UserPointer<void>|.)
- UserPointer() : pointer_(nullptr) {}
- explicit UserPointer(Type* pointer) : pointer_(pointer) {}
- // Allow implicit conversion from the "null user pointer".
- UserPointer(NullUserPointer) : pointer_(nullptr) {}
- ~UserPointer() {}
-
- // Allow assignment from the "null user pointer".
- UserPointer<Type>& operator=(NullUserPointer) {
- pointer_ = nullptr;
- return *this;
- }
-
- // Allow conversion to a "non-const" |UserPointer|.
- operator UserPointer<const Type>() const {
- return UserPointer<const Type>(pointer_);
- }
-
- bool IsNull() const { return !pointer_; }
-
- // "Reinterpret casts" to a |UserPointer<ToType>|.
- template <typename ToType>
- UserPointer<ToType> ReinterpretCast() const {
- return UserPointer<ToType>(reinterpret_cast<ToType*>(pointer_));
- }
-
- // Checks that this pointer points to a valid |Type| in the same way as
- // |Get()| and |Put()|.
- // TODO(vtl): Logically, there should be separate read checks and write
- // checks.
- void Check() const {
- internal::CheckUserPointer<sizeof(NonVoidType), MOJO_ALIGNOF(NonVoidType)>(
- pointer_);
- }
-
- // Checks that this pointer points to a valid array (of type |Type|, or just a
- // buffer if |Type| is |void| or |const void|) of |count| elements (or bytes
- // if |Type| is |void| or |const void|) in the same way as |GetArray()| and
- // |PutArray()|.
- // TODO(vtl): Logically, there should be separate read checks and write
- // checks.
- // TODO(vtl): Switch more things to use this.
- void CheckArray(size_t count) const {
- internal::CheckUserPointerWithCount<sizeof(NonVoidType),
- MOJO_ALIGNOF(NonVoidType)>(pointer_,
- count);
- }
-
- // Gets the value (of type |Type|, or a |char| if |Type| is |void|) pointed to
- // by this user pointer. Use this when you'd use the rvalue |*user_pointer|,
- // but be aware that this may be costly -- so if the value will be used
- // multiple times, you should save it.
- //
- // (We want to force a copy here, so return |Type| not |const Type&|.)
- NonVoidType Get() const {
- Check();
- internal::CheckUserPointer<sizeof(NonVoidType), MOJO_ALIGNOF(NonVoidType)>(
- pointer_);
- return *pointer_;
- }
-
- // Gets an array (of type |Type|, or just a buffer if |Type| is |void| or
- // |const void|) of |count| elements (or bytes if |Type| is |void| or |const
- // void|) from the location pointed to by this user pointer. Use this when
- // you'd do something like |memcpy(destination, user_pointer, count *
- // sizeof(Type)|.
- void GetArray(typename internal::remove_const<Type>::type* destination,
- size_t count) const {
- CheckArray(count);
- memcpy(destination, pointer_, count * sizeof(NonVoidType));
- }
-
- // Puts a value (of type |Type|, or of type |char| if |Type| is |void|) to the
- // location pointed to by this user pointer. Use this when you'd use the
- // lvalue |*user_pointer|. Since this may be costly, you should avoid using
- // this (for the same user pointer) more than once.
- //
- // Note: This |Put()| method is not valid when |T| is const, e.g., |const
- // uint32_t|, but it's okay to include them so long as this template is only
- // implicitly instantiated (see 14.7.1 of the C++11 standard) and not
- // explicitly instantiated. (On implicit instantiation, only the declarations
- // need be valid, not the definitions.)
- //
- // In C++11, we could do something like:
- // template <typename _Type = Type>
- // typename enable_if<!is_const<_Type>::value &&
- // !is_void<_Type>::value>::type Put(
- // const _Type& value) { ... }
- // (which obviously be correct), but C++03 doesn't allow default function
- // template arguments.
- void Put(const NonVoidType& value) {
- Check();
- *pointer_ = value;
- }
-
- // Puts an array (of type |Type|, or just a buffer if |Type| is |void|) with
- // |count| elements (or bytes |Type| is |void|) to the location pointed to by
- // this user pointer. Use this when you'd do something like
- // |memcpy(user_pointer, source, count * sizeof(Type))|.
- //
- // Note: The same comments about the validity of |Put()| (except for the part
- // about |void|) apply here.
- void PutArray(const Type* source, size_t count) {
- CheckArray(count);
- memcpy(pointer_, source, count * sizeof(NonVoidType));
- }
-
- // Gets a |UserPointer| at offset |i| (in |Type|s) relative to this.
- UserPointer At(size_t i) const {
- return UserPointer(
- static_cast<Type*>(static_cast<NonVoidType*>(pointer_) + i));
- }
-
- // Gets the value of the |UserPointer| as a |uintptr_t|. This should not be
- // casted back to a pointer (and dereferenced), but may be used as a key for
- // lookup or passed back to the user.
- uintptr_t GetPointerValue() const {
- return reinterpret_cast<uintptr_t>(pointer_);
- }
-
- // These provides safe (read-only/write-only/read-and-write) access to a
- // |UserPointer<Type>| (probably pointing to an array) using just an ordinary
- // pointer (obtained via |GetPointer()|).
- //
- // The memory returned by |GetPointer()| may be a copy of the original user
- // memory, but should be modified only if the user is intended to eventually
- // see the change.) If any changes are made, |Commit()| should be called to
- // guarantee that the changes are written back to user memory (it may be
- // called multiple times).
- //
- // Note: These classes are designed to allow fast, unsafe implementations (in
- // which |GetPointer()| just returns the user pointer) if desired. Thus if
- // |Commit()| is *not* called, changes may or may not be made visible to the
- // user.
- //
- // Use these classes in the following way:
- //
- // MojoResult Core::PutFoos(UserPointer<const uint32_t> foos,
- // uint32_t num_foos) {
- // UserPointer<const uint32_t>::Reader foos_reader(foos, num_foos);
- // return PutFoosImpl(foos_reader.GetPointer(), num_foos);
- // }
- //
- // MojoResult Core::GetFoos(UserPointer<uint32_t> foos,
- // uint32_t num_foos) {
- // UserPointer<uint32_t>::Writer foos_writer(foos, num_foos);
- // MojoResult rv = GetFoosImpl(foos.GetPointer(), num_foos);
- // foos_writer.Commit();
- // return rv;
- // }
- //
- // TODO(vtl): Possibly, since we're not really being safe, we should just not
- // copy for Release builds.
- typedef UserPointerReader<Type> Reader;
- typedef UserPointerWriter<Type> Writer;
- typedef UserPointerReaderWriter<Type> ReaderWriter;
-
- private:
- friend class UserPointerReader<Type>;
- friend class UserPointerReader<const Type>;
- friend class UserPointerWriter<Type>;
- friend class UserPointerReaderWriter<Type>;
- template <class Options>
- friend class UserOptionsReader;
-
- Type* pointer_;
- // Allow copy and assignment.
-};
-
-// Provides a convenient way to make a |UserPointer<Type>|.
-template <typename Type>
-inline UserPointer<Type> MakeUserPointer(Type* pointer) {
- return UserPointer<Type>(pointer);
-}
-
-// Implementation of |UserPointer<Type>::Reader|.
-template <typename Type>
-class UserPointerReader {
- private:
- typedef typename internal::remove_const<Type>::type TypeNoConst;
-
- public:
- // Note: If |count| is zero, |GetPointer()| will always return null.
- UserPointerReader(UserPointer<const Type> user_pointer, size_t count) {
- Init(user_pointer.pointer_, count, true);
- }
- UserPointerReader(UserPointer<TypeNoConst> user_pointer, size_t count) {
- Init(user_pointer.pointer_, count, true);
- }
-
- const Type* GetPointer() const { return buffer_.get(); }
-
- private:
- template <class Options>
- friend class UserOptionsReader;
-
- struct NoCheck {};
- UserPointerReader(NoCheck,
- UserPointer<const Type> user_pointer,
- size_t count) {
- Init(user_pointer.pointer_, count, false);
- }
-
- void Init(const Type* user_pointer, size_t count, bool check) {
- if (count == 0)
- return;
-
- if (check) {
- internal::CheckUserPointerWithCount<sizeof(Type), MOJO_ALIGNOF(Type)>(
- user_pointer, count);
- }
- buffer_.reset(new TypeNoConst[count]);
- memcpy(buffer_.get(), user_pointer, count * sizeof(Type));
- }
-
- scoped_ptr<TypeNoConst[]> buffer_;
-
- DISALLOW_COPY_AND_ASSIGN(UserPointerReader);
-};
-
-// Implementation of |UserPointer<Type>::Writer|.
-template <typename Type>
-class UserPointerWriter {
- public:
- // Note: If |count| is zero, |GetPointer()| will always return null.
- UserPointerWriter(UserPointer<Type> user_pointer, size_t count)
- : user_pointer_(user_pointer), count_(count) {
- if (count_ > 0) {
- buffer_.reset(new Type[count_]);
- memset(buffer_.get(), 0, count_ * sizeof(Type));
- }
- }
-
- Type* GetPointer() const { return buffer_.get(); }
-
- void Commit() {
- internal::CheckUserPointerWithCount<sizeof(Type), MOJO_ALIGNOF(Type)>(
- user_pointer_.pointer_, count_);
- memcpy(user_pointer_.pointer_, buffer_.get(), count_ * sizeof(Type));
- }
-
- private:
- UserPointer<Type> user_pointer_;
- size_t count_;
- scoped_ptr<Type[]> buffer_;
-
- DISALLOW_COPY_AND_ASSIGN(UserPointerWriter);
-};
-
-// Implementation of |UserPointer<Type>::ReaderWriter|.
-template <typename Type>
-class UserPointerReaderWriter {
- public:
- // Note: If |count| is zero, |GetPointer()| will always return null.
- UserPointerReaderWriter(UserPointer<Type> user_pointer, size_t count)
- : user_pointer_(user_pointer), count_(count) {
- if (count_ > 0) {
- internal::CheckUserPointerWithCount<sizeof(Type), MOJO_ALIGNOF(Type)>(
- user_pointer_.pointer_, count_);
- buffer_.reset(new Type[count]);
- memcpy(buffer_.get(), user_pointer.pointer_, count * sizeof(Type));
- }
- }
-
- Type* GetPointer() const { return buffer_.get(); }
- size_t GetCount() const { return count_; }
-
- void Commit() {
- internal::CheckUserPointerWithCount<sizeof(Type), MOJO_ALIGNOF(Type)>(
- user_pointer_.pointer_, count_);
- memcpy(user_pointer_.pointer_, buffer_.get(), count_ * sizeof(Type));
- }
-
- private:
- UserPointer<Type> user_pointer_;
- size_t count_;
- scoped_ptr<Type[]> buffer_;
-
- DISALLOW_COPY_AND_ASSIGN(UserPointerReaderWriter);
-};
-
-} // namespace system
-} // namespace mojo
-
-#endif // MOJO_EDK_SYSTEM_MEMORY_H_
« no previous file with comments | « mojo/edk/system/mapping_table.cc ('k') | mojo/edk/system/memory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698