/*=========================================================================
 * 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 "CacheableObjectArray.hpp"
#include "DataOutput.hpp"
#include "DataInput.hpp"
#include "ExceptionTypes.hpp"
#include "GemfireTypeIds.hpp"
#include "impl/GemfireTypeIdsImpl.hpp"


namespace gemfire
{

  void CacheableObjectArray::toData( DataOutput& output ) const
  {
    int32_t len = size( );
    output.writeArrayLen(len);
    output.write((int8_t)GemfireTypeIdsImpl::Class);
    output.write((int8_t)GemfireTypeIds::CacheableASCIIString);
    output.writeASCII("java.lang.Object");
    for ( Iterator iter = begin( ); iter != end( ); ++iter ) {
      output.writeObject( *iter );
    }
  }

  Serializable* CacheableObjectArray::fromData( DataInput& input )
  {
    int32_t len;
    input.readArrayLen( &len );
    if ( len >= 0 ) {
      int8_t header;
      input.read(&header); // ignore CLASS typeid
      input.read(&header); // ignore string typeid
      uint16_t classLen;
      input.readInt( &classLen );
      input.advanceCursor( classLen );
      CacheablePtr obj;
      for ( int32_t index = 0; index < len; index++ ) {
        input.readObject( obj );
        push_back( obj );
      }
    }
    return this;
  }

  int32_t CacheableObjectArray::classId( ) const
  {
    return 0;
  }

  int8_t CacheableObjectArray::typeId( ) const
  {
    return GemfireTypeIds::CacheableObjectArray;
  }

  uint32_t CacheableObjectArray::objectSize() const
  {
    uint32_t size = sizeof( CacheableObjectArray );
    for ( Iterator iter = begin( ); iter != end( ); ++iter ) {
      size += (*iter)->objectSize( );
    }
    return size;
  }

}
