| // Copyright (c) 2011 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 PPAPI_SHARED_IMPL_ID_ASSIGNMENT_H_ | |
| #define PPAPI_SHARED_IMPL_ID_ASSIGNMENT_H_ | |
| #include <stdint.h> | |
| #include <limits> | |
| #include "ppapi/shared_impl/ppapi_shared_export.h" | |
| namespace ppapi { | |
| enum PPIdType { | |
| PP_ID_TYPE_MODULE, | |
| PP_ID_TYPE_INSTANCE, | |
| PP_ID_TYPE_RESOURCE, | |
| PP_ID_TYPE_VAR, | |
| // Not a real type, must be last. | |
| PP_ID_TYPE_COUNT | |
| }; | |
| PPAPI_SHARED_EXPORT extern const unsigned int kPPIdTypeBits; | |
| extern const int32_t kMaxPPId; | |
| // The least significant bits are the type, the rest are the value. | |
| template <typename T> | |
| inline T MakeTypedId(T value, PPIdType type) { | |
| return (value << kPPIdTypeBits) | static_cast<T>(type); | |
| } | |
| template <typename T> | |
| inline bool CheckIdType(T id, PPIdType type) { | |
| // Say a resource of 0 is always valid, since that means "no resource." | |
| // You shouldn't be passing 0 var, instance, or module IDs around so those | |
| // are still invalid. | |
| if (type == PP_ID_TYPE_RESOURCE && !id) | |
| return true; | |
| const T mask = (static_cast<T>(1) << kPPIdTypeBits) - 1; | |
| return (id & mask) == type; | |
| } | |
| } // namespace ppapi | |
| #endif // PPAPI_SHARED_IMPL_ID_ASSIGNMENT_H_ |