2005/5/9

     
 

ObjectReader.h

artefaktur
// -*- mode:C++; tab-width:2; c-basic-offset:2; indent-tabs-mode:nil -*-
//
// Copyright (C) 2000-2005 by Roger Rene Kommer / artefaktur, Kassel, Germany.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public License (LGPL).
// 
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
// License ACDK-FreeLicense document enclosed in the distribution
// for more for more details.
// This file is part of the Artefaktur Component Development Kit:
//                         ACDK
//
// Please refer to
// - http://www.acdk.de
// - http://www.artefaktur.com
// - http://acdk.sourceforge.net
// for more information.
//
// $Header: /cvsroot/acdk/acdk/acdk_core/src/acdk/io/ObjectReader.h,v 1.20 2005/04/09 19:26:45 kommer Exp $
#ifndef acdk_io_ObjectReader_h
#define acdk_io_ObjectReader_h

#include <acdk/io/DataReader.h>
#include "SerializedObjectDescriptor.h"

namespace acdk {
namespace io {

using namespace acdk::lang;


ACDK_DECL_INTERFACE(ObjectWriter);


/**
  Interface for reading basic and object types.
  API: ACDK<br/>
  See also:  Serialization.

  @author Roger Rene Kommer (mailto:kommer@artefaktur.com)
  @version $Revision: 1.20 $
  @date $Date: 2005/04/09 19:26:45 $
*/
ACDK_INTERFACE class ACDK_CORE_PUBLIC ObjectReader
: implements DataReader
{
  ACDK_WITH_METAINFO(ObjectReader)
public:
   // from Reader
  overwrite jlong seek(SeekPos seekrel, jlong seekpos) = 0;
  overwrite void reset() = 0;
  overwrite jlong skip(jlong n) = 0;

  // from FilterReader
  overwrite void setIn(IN(RReader) reader) = 0;
  overwrite RStorage getStorage() = 0;
  overwrite RReader getStorageReader() = 0;

  overwrite bool readBoolean() = 0;
  overwrite char readChar() = 0;
  overwrite uc2char readUcChar() = 0;
  overwrite double readDouble() = 0;
  overwrite float readFloat() = 0;
  overwrite int readInt() = 0;
  overwrite jlong readLong() = 0;
  overwrite short readShort() = 0;
  overwrite RString readString() = 0;

  /**
    in this Version the stream itself has to store meta information
    about the class of the object.
  */
  virtual acdk::lang::Object readObject() = 0;
  /**
    In this version, the stream may not store meta information
    about the classes
  */
  virtual acdk::lang::Object readObject(IN(::acdk::lang::RClass) cls) = 0;
  /**
    @param cls may be Nul
    @return if the readClassDescriptor just return param cls
  */
  virtual RClass readClassDescriptor(IN(RClass) cls) = 0;
  /**
    default method for reading objects data
    only fields of current class are read.
  */
  virtual void defaultReadObject(IN(RClass) cls, IN(acdk::lang::Object) obj) = 0;
  /**
    @param withTypeInfo the the is encoded in the stream
    @param withFlags  writes also the flags
  */
  foreign virtual acdk::lang::dmi::ScriptVar readScriptVar(bool withTypeInfo = true, bool withFlags = true) { return acdk::lang::dmi::ScriptVar(); }
};


typedef ObjectReader ObjectInput;
typedef RObjectReader RObjectInput;

#ifndef DOXYGENONLY

/**
  cannot implement in ObjectArrayImpl itself cause forward decl
  @internal
*/
template <class T>
inline void readObjectArray(ObjectArrayImpl<T>* This, ::acdk::io::RObjectReader in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, (T)in->readObject(::acdk::lang::Class::getSingeltonClass(T::clazzInfo())));
}

/**
  cannot implement in BasicArrayImpl itself cause forward decl
  @internal
*/
template <class T>
inline void readBasicArray(BasicArray<T>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  if (typeid(T) == typeid(bool)) {
    for (int i = 0; i < size; i++)
      This->set(i, in->readBoolean());
  } else if (typeid(T) == typeid(char)) {
    for (int i = 0; i < size; i++)
      This->set(i, in->readChar());
  } else if  (typeid(T) == typeid(byte)) {
    for (int i = 0; i < size; i++)
      This->set(i, (byte)in->readChar());
  } else if (typeid(T) == typeid(short)) {
    for (int i = 0; i < size; i++)
      This->set(i, in->readShort());
  } else if (typeid(T) == typeid(int)) {
    for (int i = 0; i < size; i++)
      This->set(i, in->readInt());
  } else if (typeid(T) == typeid(jlong)) {
    for (int i = 0; i < size; i++)
      This->set(i, in->readLong());
#if !defined(__GNUC__) // avoid waring, will be implemented via template specialization
  } else if (typeid(T) == typeid(float)) {
    for (int i = 0; i < size; i++)
      This->set(i, in->readFloat());
  } else if (typeid(T) == typeid(double)) {
    for (int i = 0; i < size; i++)
      This->set(i, in->readDouble());
#endif
/FONT>
  }
}

/// @internal
template <>
inline void readBasicArray(BasicArray<char>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, in->readChar());
}

/// @internal
template <>
inline void readBasicArray(BasicArray<uc2char>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, in->readShort());
}

/// @internal
template <>
inline void readBasicArray(BasicArray<bool>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, in->readBoolean());
}

/// @internal
template <>
inline void readBasicArray<byte>(BasicArray<byte>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, (byte)in->readChar());
}

/// @internal
template <>
inline void readBasicArray(BasicArray<short>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, in->readShort());
}

/// @internal
template <>
inline void readBasicArray(BasicArray<int>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, in->readInt());
}

/// @internal
template <>
inline void readBasicArray(BasicArray<jlong>* This, IN(::acdk::io::RObjectReader) in)
{
#ifndef __BORLANDC__
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
  {
    This->set(i, in->readLong());
  }
#endif //__BORLANDC__
}

/// @internal
template <>
inline void readBasicArray(BasicArray<float>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, in->readFloat());
}

/// @internal
template <>
inline void readBasicArray(BasicArray<double>* This, IN(::acdk::io::RObjectReader) in)
{
  int size = in->readInt();
  This->resize(size);
  for (int i = 0; i < size; i++)
    This->set(i, in->readDouble());
}

#endif //#ifndef DOXYGENONLY

} // io
} // acdk
#endif //acdk_io_ObjectReader_h