| /*========================================================================= |
| * 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 "Struct.hpp" |
| #include "impl/GemfireTypeIdsImpl.hpp" |
| #include "DataInput.hpp" |
| |
| namespace gemfire |
| { |
| |
| Struct::Struct( ) |
| : m_parent( NULL ), m_lastAccessIndex( 0 ) |
| { |
| } |
| |
| Struct::Struct(StructSet * ssPtr, VectorT<SerializablePtr> & fieldValues) |
| { |
| m_parent = ssPtr; |
| int32_t vecsize = fieldValues.size(); |
| for(int32_t i=0; i<vecsize; i++) |
| { |
| m_fieldValues.push_back(fieldValues[i]); |
| } |
| m_lastAccessIndex = 0; |
| } |
| |
| void Struct::skipClassName( DataInput& input ) |
| { |
| uint8_t classByte; |
| input.read(&classByte); |
| if (classByte == GemfireTypeIdsImpl::Class) |
| { |
| uint8_t stringType; |
| input.read(&stringType); // ignore string type id - assuming its a normal (under 64k) string. |
| uint16_t len; |
| input.readInt( &len ); |
| input.advanceCursor( len ); |
| } |
| else { |
| throw IllegalStateException("Struct: Did not get expected class header byte"); |
| } |
| } |
| |
| int32_t Struct::classId( ) const |
| { |
| return 0; |
| } |
| |
| int8_t Struct::typeId( ) const |
| { |
| return GemfireTypeIds::Struct; |
| } |
| |
| int8_t Struct::DSFID( ) const |
| { |
| return GemfireTypeIdsImpl::FixedIDByte; |
| } |
| |
| void Struct::toData( DataOutput& output ) const |
| { |
| throw UnsupportedOperationException( "Struct::toData: should not be called." ); |
| } |
| |
| int32_t Struct::length() const |
| { |
| return m_fieldValues.size(); |
| } |
| |
| Serializable* Struct::fromData( DataInput& input ) |
| { |
| int8_t classType; |
| input.read(&classType); |
| input.read(&classType); |
| skipClassName( input ); |
| |
| int32_t numOfFields; |
| input.readArrayLen(&numOfFields); |
| |
| m_parent = NULL; |
| for (int i=0; i< numOfFields; i++) |
| { |
| CacheableStringPtr fieldName; |
| //input.readObject(fieldName); |
| input.readNativeString(fieldName); |
| m_fieldNames.insert( fieldName, |
| CacheableInt32::create( i ) ); |
| } |
| int32_t lengthForTypes; |
| input.readArrayLen(&lengthForTypes); |
| skipClassName( input ); |
| for (int i=0; i< lengthForTypes; i++) |
| { |
| input.read(&classType); |
| input.read(&classType); |
| skipClassName( input ); |
| } |
| int32_t numOfSerializedValues; |
| input.readArrayLen(&numOfSerializedValues); |
| skipClassName( input ); |
| for (int i=0; i< numOfSerializedValues; i++) |
| { |
| SerializablePtr val; |
| input.readObject(val);//Hitesh need to look |
| m_fieldValues.push_back(val); |
| } |
| return this; |
| } |
| |
| const char * Struct::getFieldName(int32_t index) |
| { |
| if ( m_parent != NULL ) { |
| return m_parent->getFieldName( index ); |
| } |
| else { |
| for ( HashMapT< CacheableStringPtr, CacheableInt32Ptr >::Iterator iter = |
| m_fieldNames.begin( ); iter != m_fieldNames.end( ); ++iter ) { |
| if( *(iter.second()) == index ) return iter.first()->asChar(); |
| } |
| |
| } |
| |
| return NULL; |
| } |
| |
| const SerializablePtr Struct::operator [] (int32_t index) const |
| { |
| if (index>=m_fieldValues.size()) |
| { |
| return NULLPTR; |
| } |
| |
| return m_fieldValues[index]; |
| } |
| |
| const SerializablePtr Struct::operator [] (const char * fieldName) const |
| { |
| int32_t index; |
| if ( m_parent == NULL ) { |
| CacheableStringPtr fName = CacheableString::create( fieldName ); |
| HashMapT< CacheableStringPtr, CacheableInt32Ptr >::Iterator iter = |
| m_fieldNames.find( fName ); |
| if ( iter == m_fieldNames.end( ) ) { |
| throw OutOfRangeException( "Struct: fieldName not found." ); |
| } |
| index = iter.second( )->value( ); |
| } else { |
| index = m_parent->getFieldIndex(fieldName); |
| } |
| return m_fieldValues[index]; |
| } |
| |
| const StructSetPtr Struct::getStructSet() const |
| { |
| return StructSetPtr(m_parent); |
| } |
| |
| bool Struct::hasNext() const |
| { |
| if (m_lastAccessIndex+1 <= m_fieldValues.size()) |
| { |
| return true; |
| } |
| return false; |
| } |
| |
| const SerializablePtr Struct::next() |
| { |
| m_lastAccessIndex++; |
| return m_fieldValues[m_lastAccessIndex-1]; |
| } |
| |
| Serializable* Struct::createDeserializable( ) |
| { |
| return new Struct( ); |
| } |
| |
| } // end namespace gemfire |