| /*========================================================================= |
| * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. |
| * This product is protected by U.S. and international copyright |
| * and intellectual property laws. Pivotal products are covered by |
| * one or more patents listed at http://www.pivotal.io/patents. |
| *========================================================================= |
| */ |
| #include "../gfcpp_globals.hpp" |
| |
| #include "CacheableToken.hpp" |
| |
| #include "../DataInput.hpp" |
| #include "../DataOutput.hpp" |
| #include "../CacheableString.hpp" |
| #include "GemfireTypeIdsImpl.hpp" |
| |
| using namespace gemfire; |
| |
| //---- statics |
| |
| CacheableTokenPtr* CacheableToken::invalidToken = 0; |
| CacheableTokenPtr* CacheableToken::destroyedToken = 0; |
| CacheableTokenPtr* CacheableToken::overflowedToken = 0; |
| CacheableTokenPtr* CacheableToken::tombstoneToken = 0; |
| |
| void CacheableToken::init() |
| { |
| if (CacheableToken::invalidToken == 0) { |
| CacheableToken::invalidToken = new CacheableTokenPtr(); |
| *CacheableToken::invalidToken = new CacheableToken( |
| CacheableToken::INVALID); |
| CacheableToken::destroyedToken = new CacheableTokenPtr(); |
| *CacheableToken::destroyedToken = new CacheableToken( |
| CacheableToken::DESTROYED); |
| CacheableToken::overflowedToken = new CacheableTokenPtr(); |
| *CacheableToken::overflowedToken = new CacheableToken( |
| CacheableToken::OVERFLOWED); |
| CacheableToken::tombstoneToken = new CacheableTokenPtr(); |
| *CacheableToken::tombstoneToken = new CacheableToken( |
| CacheableToken::TOMBSTONE); |
| } |
| } |
| |
| //----- serialization |
| |
| Serializable* CacheableToken::createDeserializable() |
| { |
| return new CacheableToken(); |
| } |
| |
| void CacheableToken::toData(DataOutput& output) const |
| { |
| output.writeInt((int32_t)m_value); |
| } |
| |
| Serializable* CacheableToken::fromData(DataInput& input) |
| { |
| input.readInt((int32_t*) &m_value); |
| switch (m_value) { |
| case INVALID: |
| return invalidToken->ptr(); |
| case DESTROYED: |
| return destroyedToken->ptr(); |
| case OVERFLOWED: |
| return overflowedToken->ptr(); |
| case TOMBSTONE: |
| return tombstoneToken->ptr(); |
| |
| default: |
| GF_D_ASSERT(false); |
| // we really can't be returning new instances all the time.. |
| // because we wish to test tokens with pointer identity. |
| return this; |
| } |
| } |
| |
| int32_t CacheableToken::classId() const |
| { |
| return 0; |
| } |
| |
| int8_t CacheableToken::typeId() const |
| { |
| return (int8_t)GemfireTypeIdsImpl::CacheableToken; |
| } |
| |
| //------ ctor |
| |
| CacheableToken::CacheableToken() : |
| m_value(CacheableToken::NOT_USED) |
| { |
| } |
| |
| CacheableToken::CacheableToken(TokenType value) : |
| m_value(value) |
| { |
| } |
| |
| //------- dtor |
| |
| CacheableToken::~CacheableToken() |
| { |
| } |
| |
| /** |
| * Display this object as 'string', which depend on the implementation in |
| * the subclasses |
| * The default implementation renders the classname. |
| */ |
| CacheableStringPtr CacheableToken::toString() const |
| { |
| static const char* ctstrings[] = { |
| "CacheableToken::NOT_USED", |
| "CacheableToken::INVALID", |
| "CacheableToken::DESTROYED", |
| "CacheableToken::OVERFLOWED", |
| "CacheableToken::TOMBSTONE" }; |
| |
| return CacheableString::create(ctstrings[m_value]); |
| } |
| |
| uint32_t CacheableToken::objectSize() const |
| { |
| return sizeof(m_value); |
| } |