#pragma once

#ifndef GEODE_GFCPP_PDXAUTOSERIALIZER_H_
#define GEODE_GFCPP_PDXAUTOSERIALIZER_H_


/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "gfcpp_globals.hpp"
#include "PdxWriter.hpp"
#include "PdxReader.hpp"
#include "VectorT.hpp"
#include "HashMapT.hpp"
#include "HashSetT.hpp"
#include "GeodeTypeIds.hpp"
#include "TypeHelper.hpp"

namespace apache {
namespace geode {
namespace client {
namespace PdxAutoSerializable {
// Read and write methods for various types
// uint8_t
//------------------------------------------------------------------------------------------------
#ifdef _SOLARIS
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int8_t value) {
  pw->writeByte(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int8_t& value) {
  value = pr->readByte(fieldName);
}
#else
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, char value) {
  pw->writeChar(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, char& value) {
  value = pr->readChar(fieldName);
}
#endif
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, wchar_t value) {
  pw->writeWideChar(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, wchar_t& value) {
  value = pr->readWideChar(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, bool value) {
  pw->writeBoolean(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, bool& value) {
  value = pr->readBoolean(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, signed char value) {
  pw->writeByte(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, signed char& value) {
  value = pr->readByte(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int16_t value) {
  pw->writeShort(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int16_t& value) {
  value = pr->readShort(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int32_t value) {
  pw->writeInt(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int32_t& value) {
  value = pr->readInt(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int64_t value) {
  pw->writeLong(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int64_t& value) {
  value = pr->readLong(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, float value) {
  pw->writeFloat(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, float& value) {
  value = pr->readFloat(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, double value) {
  pw->writeDouble(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, double& value) {
  value = pr->readDouble(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, CacheableDatePtr value) {
  pw->writeDate(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, CacheableDatePtr& value) {
  value = pr->readDate(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, const char* value) {
  pw->writeString(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, char*& value) {
  value = pr->readString(fieldName);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, const wchar_t* value) {
  pw->writeWideString(fieldName, value);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, wchar_t*& value) {
  value = pr->readWideString(fieldName);
}
// ---- helper methods for bytearrayofarray -------
#ifdef _SOLARIS
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, char** value,
                           int32_t arraySize, int32_t* elemArraySize) {
  pw->writeArrayOfByteArrays(fieldName, (char**)value, arraySize,
                             elemArraySize);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, char**& value, int32_t& len,
                          int32_t*& Lengtharr) {
  GF_NEW(Lengtharr, int32_t[len]);
  value = (char**)pr->readArrayOfByteArrays(fieldName, len, &Lengtharr);
}
#else
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int8_t** value,
                           int32_t arraySize, int32_t* elemArraySize) {
  pw->writeArrayOfByteArrays(fieldName, value, arraySize, elemArraySize);
}
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int8_t**& value, int32_t& len,
                          int32_t*& Lengtharr) {
  GF_NEW(Lengtharr, int32_t[len]);
  value = (signed char**)pr->readArrayOfByteArrays(fieldName, len, &Lengtharr);
}
#endif

//------------------------------------------------------------------------------------------------
// Base Serializable types
template <typename TObj>
inline void writePdxObject(
    apache::geode::client::PdxWriterPtr& pw, const char* fieldName,
    const apache::geode::client::SharedPtr<TObj>& value,
    apache::geode::client::TypeHelper::yes_type isSerializable) {
  pw->writeObject(fieldName, value);
}

template <typename TObj>
inline void writePdxObject(
    apache::geode::client::PdxWriterPtr& pw, const char* fieldName,
    const apache::geode::client::SharedPtr<TObj>& value) {
  writePdxObject(pw, fieldName, value, GF_TYPE_IS_SERIALIZABLE_TYPE(TObj));
}

template <typename TObj>
inline void readPdxObject(
    apache::geode::client::PdxReaderPtr& pr, const char* fieldName,
    apache::geode::client::SharedPtr<TObj>& value,
    apache::geode::client::TypeHelper::yes_type isSerializable) {
  value = dynCast<apache::geode::client::SharedPtr<TObj> >(
      pr->readObject(fieldName));
}

template <typename TObj>
inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName,
                          apache::geode::client::SharedPtr<TObj>& value) {
  readPdxObject(pr, fieldName, value, GF_TYPE_IS_SERIALIZABLE_TYPE(TObj));
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, bool* value, int32_t len) {
  pw->writeBooleanArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, bool*& value, int32_t& len) {
  value = pr->readBooleanArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, wchar_t* value, int32_t len) {
  pw->writeWideCharArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, wchar_t*& value,
                          int32_t& len) {
  value = pr->readWideCharArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
#ifdef _SOLARIS
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int8_t* value, int32_t len) {
  pw->writeByteArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int8_t*& value, int32_t& len) {
  value = (int8_t*)pr->readByteArray(fieldName, len);
}
#else
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, char* value, int32_t len) {
  pw->writeCharArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, char*& value, int32_t& len) {
  value = pr->readCharArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, signed char* value,
                           int32_t len) {
  pw->writeByteArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, signed char*& value,
                          int32_t& len) {
  value = (signed char*)pr->readByteArray(fieldName, len);
}
#endif
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int16_t* value, int32_t len) {
  pw->writeShortArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int16_t*& value,
                          int32_t& len) {
  value = pr->readShortArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int32_t* value, int32_t len) {
  pw->writeIntArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int32_t*& value,
                          int32_t& len) {
  value = pr->readIntArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, int64_t* value, int32_t len) {
  pw->writeLongArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, int64_t*& value,
                          int32_t& len) {
  value = pr->readLongArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, float* value, int32_t len) {
  pw->writeFloatArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, float*& value, int32_t& len) {
  value = pr->readFloatArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, double* value, int32_t len) {
  pw->writeDoubleArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, double*& value, int32_t& len) {
  value = pr->readDoubleArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, char** value, int32_t len) {
  pw->writeStringArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, char**& value, int32_t& len) {
  value = pr->readStringArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName, wchar_t** value,
                           int32_t len) {
  pw->writeWideStringArray(fieldName, value, len);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName, wchar_t**& value,
                          int32_t& len) {
  value = pr->readWideStringArray(fieldName, len);
}
//------------------------------------------------------------------------------------------------
inline void writePdxObject(apache::geode::client::PdxWriterPtr& pw,
                           const char* fieldName,
                           CacheableObjectArrayPtr value) {
  pw->writeObjectArray(fieldName, value);
}

inline void readPdxObject(apache::geode::client::PdxReaderPtr& pr,
                          const char* fieldName,
                          CacheableObjectArrayPtr& value) {
  value = pr->readObjectArray(fieldName);
}
//------------------------------------------------------------------------------------------------
// For containers vector/hashmap/hashset
// template <typename TObj>
// inline void writePdxObject( apache::geode::client::PdxWriterPtr& pw,  const
// char*
// fieldName,
//    const VectorT< TObj >& value )
//{
//  int32_t len = (int32_t)value.size();
//  pw->writeArrayLen( len );
//  for ( typename VectorT< TObj >::Iterator iter = value.begin( );
//      iter != value.end( ); ++iter ) {
//    writePdxObject( output, *iter );
//  }
//}

// inline uint32_t objectSize( const _VectorOfCacheable& value )
//{
//  uint32_t objectSize = 0;
//  for ( _VectorOfCacheable::Iterator iter = value.begin( );
//      iter != value.end( ); ++iter ) {
//    if (*iter != NULLPTR) {
//      objectSize += (*iter)->objectSize( );
//    }
//  }
//  objectSize += (sizeof(CacheablePtr) * (uint32_t)value.size());
//  return objectSize;
//}

// template <typename TObj>
// inline void readPdxObject( apache::geode::client::PdxReaderPtr& pr,  const
// char* fieldName,
//    VectorT< TObj >& value )
//{
//  int32_t len;
//  pr->readArrayLen( &len );
//  if ( len >= 0 ) {
//    TObj obj;
//    for ( int32_t index = 0; index < len; index++ ) {
//      readPdxObject( input, obj );
//      value.push_back( obj );
//    }
//  }
//}

// template <typename TKey, typename TValue>
// inline void writePdxObject( apache::geode::client::PdxWriterPtr& pw,  const
// char*
// fieldName,
//    const HashMapT< TKey, TValue >& value )
//{
//  int32_t len = (int32_t)value.size();
//  pw->writeArrayLen( len );
//  if ( len > 0 ) {
//    for ( typename HashMapT< TKey, TValue >::Iterator iter = value.begin( );
//        iter != value.end( ); ++iter ) {
//      writePdxObject( output, iter.first( ) );
//      writePdxObject( output, iter.second( ) );
//    }
//  }
//}

// inline uint32_t objectSize( const _HashMapOfCacheable& value )
//{
//  uint32_t objectSize = 0;
//  for ( _HashMapOfCacheable::Iterator iter = value.begin( );
//      iter != value.end( ); ++iter ) {
//    objectSize += iter.first( )->objectSize( );
//    if (iter.second( ) != NULLPTR) {
//      objectSize += iter.second( )->objectSize( );
//    }
//  }
//  objectSize += ( ( sizeof( CacheableKeyPtr ) + sizeof( CacheablePtr ) )
//      * (uint32_t)value.size());
//  return objectSize;
//}

// template <typename TKey, typename TValue>
// inline void readPdxObject( apache::geode::client::PdxReaderPtr& pr,  const
// char* fieldName,
//    HashMapT< TKey, TValue >& value )
//{
//  int32_t len;
//  pr->readArrayLen( &len );
//  if ( len > 0 ) {
//    TKey key;
//    TValue val;
//    for( int32_t index = 0; index < len; index++ ) {
//      readPdxObject( input, key );
//      readPdxObject( input, val );
//      value.insert( key, val );
//    }
//  }
//}

// template <typename TKey>
// inline void writePdxObject( apache::geode::client::PdxWriterPtr& pw,  const
// char*
// fieldName,
//  const HashSetT< TKey >& value )
//{
//  int32_t len = (int32_t)value.size();
//  pw->writeArrayLen( len );
//  for ( typename HashSetT< TKey >::Iterator iter = value.begin( );
//    iter != value.end( ); ++iter ) {
//    writePdxObject( output, *iter );
//  }
//}

// inline uint32_t objectSize( const _HashSetOfCacheableKey& value )
//{
//  uint32_t objectSize = 0;
//  for ( _HashSetOfCacheableKey::Iterator iter = value.begin( );
//    iter != value.end( ); ++iter ) {
//    if (*iter != NULLPTR) {
//      objectSize += (*iter)->objectSize( );
//    }
//  }
//  objectSize += (sizeof(CacheableKeyPtr) * (uint32_t)value.size());
//  return objectSize;
//}

// template <typename TKey>
// inline void readPdxObject( apache::geode::client::PdxReaderPtr& pr,  const
// char* fieldName,
//    HashSetT< TKey >& value )
//{
//  int32_t len;
//  pr->readArrayLen( &len );
//  if ( len > 0 ) {
//    TKey key;
//    for( int32_t index = 0; index < len; index++ ) {
//      readPdxObject( input, key );
//      value.insert( key );
//    }
//  }
//}

//// Default value for builtin types

// template <typename TObj>
// inline TObj zeroObject( )
//{
//  return 0;
//}

// template <>
// inline bool zeroObject<bool>( )
//{
//  return false;
//}

// template <>
// inline double zeroObject<double>( )
//{
//  return 0.0;
//}

// template <>
// inline float zeroObject<float>( )
//{
//  return 0.0F;
//}

}  // namespace PdxAutoSerializable
}  // namespace client
}  // namespace geode
}  // namespace apache


#endif // GEODE_GFCPP_PDXAUTOSERIALIZER_H_
