You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/09/04 18:27:19 UTC
[05/55] [abbrv] ignite git commit: IGNITE-1364: Moved CPP module to
Ignite.
http://git-wip-us.apache.org/repos/asf/ignite/blob/58a665aa/modules/platform/src/main/cpp/core/include/ignite/impl/portable/portable_writer_impl.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/core/include/ignite/impl/portable/portable_writer_impl.h b/modules/platform/src/main/cpp/core/include/ignite/impl/portable/portable_writer_impl.h
new file mode 100644
index 0000000..b38dc1f
--- /dev/null
+++ b/modules/platform/src/main/cpp/core/include/ignite/impl/portable/portable_writer_impl.h
@@ -0,0 +1,859 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_IMPL_PORTABLE_WRITER
+#define _IGNITE_IMPL_PORTABLE_WRITER
+
+#include <cstring>
+#include <string>
+#include <stdint.h>
+
+#include <ignite/common/common.h>
+#include <ignite/common/concurrent.h>
+
+#include "ignite/impl/interop/interop_output_stream.h"
+#include "ignite/impl/portable/portable_common.h"
+#include "ignite/impl/portable/portable_id_resolver.h"
+#include "ignite/impl/portable/portable_metadata_manager.h"
+#include "ignite/impl/portable/portable_utils.h"
+#include "ignite/portable/portable_consts.h"
+#include "ignite/portable/portable_type.h"
+#include "ignite/guid.h"
+
+namespace ignite
+{
+ namespace impl
+ {
+ namespace portable
+ {
+ /**
+ * Internal implementation of portable reader.
+ */
+ class IGNITE_IMPORT_EXPORT PortableWriterImpl
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param stream Interop stream.
+ * @param idRslvr Portable ID resolver.
+ * @param metaMgr Metadata manager.
+ * @param metaHnd Metadata handler.
+ */
+ PortableWriterImpl(ignite::impl::interop::InteropOutputStream* stream, PortableIdResolver* idRslvr,
+ PortableMetadataManager* metaMgr, PortableMetadataHandler* metaHnd);
+
+ /**
+ * Constructor used to construct light-weight writer allowing only raw operations
+ * and primitive objects.
+ *
+ * @param stream Interop stream.
+ * @param metaMgr Metadata manager.
+ */
+ PortableWriterImpl(ignite::impl::interop::InteropOutputStream* stream, PortableMetadataManager* metaMgr);
+
+ /**
+ * Write 8-byte signed integer. Maps to "byte" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt8(const int8_t val);
+
+ /**
+ * Write array of 8-byte signed integers. Maps to "byte[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt8Array(const int8_t* val, const int32_t len);
+
+ /**
+ * Write 8-byte signed integer. Maps to "byte" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteInt8(const char* fieldName, const int8_t val);
+
+ /**
+ * Write array of 8-byte signed integers. Maps to "byte[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt8Array(const char* fieldName, const int8_t* val, const int32_t len);
+
+ /**
+ * Write bool. Maps to "short" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteBool(const bool val);
+
+ /**
+ * Write array of bools. Maps to "bool[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteBoolArray(const bool* val, const int32_t len);
+
+ /**
+ * Write bool. Maps to "short" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteBool(const char* fieldName, const bool val);
+
+ /**
+ * Write array of bools. Maps to "bool[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteBoolArray(const char* fieldName, const bool* val, const int32_t len);
+
+ /**
+ * Write 16-byte signed integer. Maps to "short" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt16(const int16_t val);
+
+ /**
+ * Write array of 16-byte signed integers. Maps to "short[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt16Array(const int16_t* val, const int32_t len);
+
+ /**
+ * Write 16-byte signed integer. Maps to "short" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteInt16(const char* fieldName, const int16_t val);
+
+ /**
+ * Write array of 16-byte signed integers. Maps to "short[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt16Array(const char* fieldName, const int16_t* val, const int32_t len);
+
+ /**
+ * Write 16-byte unsigned integer. Maps to "char" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteUInt16(const uint16_t val);
+
+ /**
+ * Write array of 16-byte unsigned integers. Maps to "char[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteUInt16Array(const uint16_t* val, const int32_t len);
+
+ /**
+ * Write 16-byte unsigned integer. Maps to "char" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteUInt16(const char* fieldName, const uint16_t val);
+
+ /**
+ * Write array of 16-byte unsigned integers. Maps to "char[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteUInt16Array(const char* fieldName, const uint16_t* val, const int32_t len);
+
+ /**
+ * Write 32-byte signed integer. Maps to "int" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt32(const int32_t val);
+
+ /**
+ * Write array of 32-byte signed integers. Maps to "int[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt32Array(const int32_t* val, const int32_t len);
+
+ /**
+ * Write 32-byte signed integer. Maps to "int" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteInt32(const char* fieldName, const int32_t val);
+
+ /**
+ * Write array of 32-byte signed integers. Maps to "int[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt32Array(const char* fieldName, const int32_t* val, const int32_t len);
+
+ /**
+ * Write 64-byte signed integer. Maps to "long" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt64(const int64_t val);
+
+ /**
+ * Write array of 64-byte signed integers. Maps to "long[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt64Array(const int64_t* val, const int32_t len);
+
+ /**
+ * Write 64-byte signed integer. Maps to "long" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteInt64(const char* fieldName, const int64_t val);
+
+ /**
+ * Write array of 64-byte signed integers. Maps to "long[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt64Array(const char* fieldName, const int64_t* val, const int32_t len);
+
+ /**
+ * Write float. Maps to "float" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteFloat(const float val);
+
+ /**
+ * Write array of floats. Maps to "float[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteFloatArray(const float* val, const int32_t len);
+
+ /**
+ * Write float. Maps to "float" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteFloat(const char* fieldName, const float val);
+
+ /**
+ * Write array of floats. Maps to "float[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteFloatArray(const char* fieldName, const float* val, const int32_t len);
+
+ /**
+ * Write double. Maps to "double" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteDouble(const double val);
+
+ /**
+ * Write array of doubles. Maps to "double[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteDoubleArray(const double* val, const int32_t len);
+
+ /**
+ * Write double. Maps to "double" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteDouble(const char* fieldName, const double val);
+
+ /**
+ * Write array of doubles. Maps to "double[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteDoubleArray(const char* fieldName, const double* val, const int32_t len);
+
+ /**
+ * Write Guid. Maps to "UUID" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteGuid(const Guid val);
+
+ /**
+ * Write array of Guids. Maps to "UUID[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteGuidArray(const Guid* val, const int32_t len);
+
+ /**
+ * Write Guid. Maps to "UUID" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ */
+ void WriteGuid(const char* fieldName, const Guid val);
+
+ /**
+ * Write array of Guids. Maps to "UUID[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteGuidArray(const char* fieldName, const Guid* val, const int32_t len);
+
+ /**
+ * Write string.
+ *
+ * @param val String.
+ * @param len String length (characters).
+ */
+ void WriteString(const char* val, const int32_t len);
+
+ /**
+ * Write string.
+ *
+ * @param fieldName Field name.
+ * @param val String.
+ * @param len String length (characters).
+ */
+ void WriteString(const char* fieldName, const char* val, const int32_t len);
+
+ /**
+ * Start string array write.
+ *
+ * @param typ Collection type.
+ * @return Session ID.
+ */
+ int32_t WriteStringArray();
+
+ /**
+ * Start string array write.
+ *
+ * @param fieldName Field name.
+ * @return Session ID.
+ */
+ int32_t WriteStringArray(const char* fieldName);
+
+ /**
+ * Write string element.
+ *
+ * @param id Session ID.
+ * @param val Value.
+ * @param len Length.
+ */
+ void WriteStringElement(int32_t id, const char* val, int32_t len);
+
+ /**
+ * Write NULL value.
+ */
+ void WriteNull();
+
+ /**
+ * Write NULL value.
+ *
+ * @param fieldName Field name.
+ */
+ void WriteNull(const char* fieldName);
+
+ /**
+ * Start array write.
+ *
+ * @param typ Collection type.
+ * @return Session ID.
+ */
+ int32_t WriteArray();
+
+ /**
+ * Start array write.
+ *
+ * @param fieldName Field name.
+ * @return Session ID.
+ */
+ int32_t WriteArray(const char* fieldName);
+
+ /**
+ * Start collection write.
+ *
+ * @param typ Collection type.
+ * @return Session ID.
+ */
+ int32_t WriteCollection(ignite::portable::CollectionType typ);
+
+ /**
+ * Start collection write.
+ *
+ * @param fieldName Field name.
+ * @param typ Collection type.
+ * @return Session ID.
+ */
+ int32_t WriteCollection(const char* fieldName, ignite::portable::CollectionType typ);
+
+ /**
+ * Start map write.
+ *
+ * @param typ Map type.
+ * @return Session ID.
+ */
+ int32_t WriteMap(ignite::portable::MapType typ);
+
+ /**
+ * Start map write.
+ *
+ * @param fieldName Field name.
+ * @param typ Map type.
+ * @return Session ID.
+ */
+ int32_t WriteMap(const char* fieldName, ignite::portable::MapType typ);
+
+ /**
+ * Write collection element.
+ *
+ * @param id Session ID.
+ * @param val Value.
+ */
+ template<typename T>
+ void WriteElement(int32_t id, T val)
+ {
+ CheckSession(id);
+
+ WriteTopObject<T>(val);
+
+ elemCnt++;
+ }
+
+ /**
+ * Write map element.
+ *
+ * @param id Session ID.
+ * @param key Key.
+ * @param val Value.
+ */
+ template<typename K, typename V>
+ void WriteElement(int32_t id, K key, V val)
+ {
+ CheckSession(id);
+
+ WriteTopObject<K>(key);
+ WriteTopObject<V>(val);
+
+ elemCnt++;
+ }
+
+ /**
+ * Commit container write session.
+ *
+ * @param id Session ID.
+ */
+ void CommitContainer(int32_t id);
+
+ /**
+ * Write object.
+ *
+ * @param val Object.
+ */
+ template<typename T>
+ void WriteObject(T val)
+ {
+ CheckRawMode(true);
+
+ WriteTopObject(val);
+ }
+
+ /**
+ * Write object.
+ *
+ * @param fieldName Field name.
+ * @param val Object.
+ */
+ template<typename T>
+ void WriteObject(const char* fieldName, T val)
+ {
+ CheckRawMode(false);
+
+ // 1. Write field ID.
+ WriteFieldId(fieldName, IGNITE_TYPE_OBJECT);
+
+ // 2. Preserve space for length.
+ int32_t lenPos = stream->Position();
+ stream->Position(lenPos + 4);
+
+ // 3. Actual write.
+ WriteTopObject(val);
+
+ // 4. Write field length.
+ int32_t len = stream->Position() - lenPos - 4;
+ stream->WriteInt32(lenPos, len);
+ }
+
+ /**
+ * Set raw mode.
+ */
+ void SetRawMode();
+
+ /**
+ * Get raw position.
+ */
+ int32_t GetRawPosition();
+
+ /**
+ * Write object.
+ *
+ * @param obj Object to write.
+ */
+ template<typename T>
+ void WriteTopObject(const T& obj)
+ {
+ ignite::portable::PortableType<T> type;
+
+ if (type.IsNull(obj))
+ stream->WriteInt8(IGNITE_HDR_NULL);
+ else
+ {
+ TemplatedPortableIdResolver<T> idRslvr(type);
+ ignite::common::concurrent::SharedPointer<PortableMetadataHandler> metaHnd;
+
+ if (metaMgr)
+ metaHnd = metaMgr->GetHandler(idRslvr.GetTypeId());
+
+ PortableWriterImpl writerImpl(stream, &idRslvr, metaMgr, metaHnd.Get());
+ ignite::portable::PortableWriter writer(&writerImpl);
+
+ int32_t pos = stream->Position();
+
+ stream->WriteInt8(IGNITE_HDR_FULL);
+ stream->WriteBool(true);
+ stream->WriteInt32(idRslvr.GetTypeId());
+ stream->WriteInt32(type.GetHashCode(obj));
+
+ stream->Position(pos + IGNITE_FULL_HDR_LEN);
+
+ type.Write(writer, obj);
+
+ int32_t len = stream->Position() - pos;
+
+ stream->WriteInt32(pos + 10, len);
+ stream->WriteInt32(pos + 14, writerImpl.GetRawPosition() - pos);
+
+ if (metaMgr)
+ metaMgr->SubmitHandler(type.GetTypeName(), idRslvr.GetTypeId(), metaHnd.Get());
+ }
+ }
+
+ /**
+ * Get underlying stream.
+ *
+ * @return Stream.
+ */
+ impl::interop::InteropOutputStream* GetStream();
+ private:
+ /** Underlying stream. */
+ ignite::impl::interop::InteropOutputStream* stream;
+
+ /** ID resolver. */
+ PortableIdResolver* idRslvr;
+
+ /** Metadata manager. */
+ PortableMetadataManager* metaMgr;
+
+ /** Metadata handler. */
+ PortableMetadataHandler* metaHnd;
+
+ /** Type ID. */
+ int32_t typeId;
+
+ /** Elements write session ID generator. */
+ int32_t elemIdGen;
+
+ /** Elements write session ID. */
+ int32_t elemId;
+
+ /** Elements count. */
+ int32_t elemCnt;
+
+ /** Elements start position. */
+ int32_t elemPos;
+
+ /** Raw data offset. */
+ int32_t rawPos;
+
+ IGNITE_NO_COPY_ASSIGNMENT(PortableWriterImpl)
+
+ /**
+ * Write a primitive value to stream in raw mode.
+ *
+ * @param val Value.
+ * @param func Stream function.
+ */
+ template<typename T>
+ void WritePrimitiveRaw(
+ const T val,
+ void(*func)(interop::InteropOutputStream*, T)
+ )
+ {
+ CheckRawMode(true);
+ CheckSingleMode(true);
+
+ func(stream, val);
+ }
+
+ /**
+ * Write a primitive array to stream in raw mode.
+ *
+ * @param val Value.
+ * @param len Array length.
+ * @param func Stream function.
+ * @param hdr Header.
+ */
+ template<typename T>
+ void WritePrimitiveArrayRaw(
+ const T* val,
+ const int32_t len,
+ void(*func)(interop::InteropOutputStream*, const T*, const int32_t),
+ const int8_t hdr
+ )
+ {
+ CheckRawMode(true);
+ CheckSingleMode(true);
+
+ if (val)
+ {
+ stream->WriteInt8(hdr);
+ stream->WriteInt32(len);
+ func(stream, val, len);
+ }
+ else
+ stream->WriteInt8(IGNITE_HDR_NULL);
+ }
+
+ /**
+ * Write a primitive value to stream.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ * @param func Stream function.
+ * @param typ Field type ID.
+ * @param len Field length.
+ */
+ template<typename T>
+ void WritePrimitive(
+ const char* fieldName,
+ const T val,
+ void(*func)(interop::InteropOutputStream*, T),
+ const int8_t typ,
+ const int32_t len
+ )
+ {
+ CheckRawMode(false);
+ CheckSingleMode(true);
+
+ WriteFieldId(fieldName, typ);
+
+ stream->WriteInt32(1 + len);
+ stream->WriteInt8(typ);
+
+ func(stream, val);
+ }
+
+ /**
+ * Write a primitive array to stream.
+ *
+ * @param fieldName Field name.
+ * @param val Value.
+ * @param len Array length.
+ * @param func Stream function.
+ * @param hdr Header.
+ * @param lenShift Length shift.
+ */
+ template<typename T>
+ void WritePrimitiveArray(
+ const char* fieldName,
+ const T* val,
+ const int32_t len,
+ void(*func)(interop::InteropOutputStream*, const T*, const int32_t),
+ const int8_t hdr,
+ const int32_t lenShift
+ )
+ {
+ CheckRawMode(false);
+ CheckSingleMode(true);
+
+ WriteFieldId(fieldName, hdr);
+
+ if (val)
+ {
+ stream->WriteInt32(5 + (len << lenShift));
+ stream->WriteInt8(hdr);
+ stream->WriteInt32(len);
+ func(stream, val, len);
+ }
+ else
+ {
+ stream->WriteInt32(1);
+ stream->WriteInt8(IGNITE_HDR_NULL);
+ }
+ }
+
+ /**
+ * Check raw mode.
+ *
+ * @param expected Expected raw mode of the reader.
+ */
+ void CheckRawMode(bool expected);
+
+ /**
+ * Check whether writer is currently operating in single mode.
+ *
+ * @param expected Expected value.
+ */
+ void CheckSingleMode(bool expected);
+
+ /**
+ * Start new container writer session.
+ *
+ * @param expRawMode Expected raw mode.
+ */
+ void StartContainerSession(bool expRawMode);
+
+ /**
+ * Check whether session ID matches.
+ *
+ * @param ses Expected session ID.
+ */
+ void CheckSession(int32_t expSes);
+
+ /**
+ * Write field ID.
+ *
+ * @param fieldName Field name.
+ * @param fieldTypeId Field type ID.
+ */
+ void WriteFieldId(const char* fieldName, int32_t fieldTypeId);
+
+ /**
+ * Write field ID and skip field length.
+ *
+ * @param fieldName Field name.
+ * @param fieldTypeId Field type ID.
+ */
+ void WriteFieldIdSkipLength(const char* fieldName, int32_t fieldTypeId);
+
+ /**
+ * Write field ID and length.
+ *
+ * @param fieldName Field name.
+ * @param fieldTypeId Field type ID.
+ * @param len Length.
+ */
+ void WriteFieldIdAndLength(const char* fieldName, int32_t fieldTypeId, int32_t len);
+
+ /**
+ * Write primitive value.
+ *
+ * @param obj Value.
+ * @param func Stream function.
+ * @param hdr Header.
+ */
+ template<typename T>
+ void WriteTopObject0(const T obj, void(*func)(impl::interop::InteropOutputStream*, T), const int8_t hdr)
+ {
+ stream->WriteInt8(hdr);
+ func(stream, obj);
+ }
+ };
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const int8_t& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const bool& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const int16_t& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const uint16_t& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const int32_t& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const int64_t& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const float& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const double& obj);
+
+ template<>
+ void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const Guid& obj);
+
+ template<>
+ inline void IGNITE_IMPORT_EXPORT PortableWriterImpl::WriteTopObject(const std::string& obj)
+ {
+ const char* obj0 = obj.c_str();
+
+ int32_t len = static_cast<int32_t>(strlen(obj0));
+
+ stream->WriteInt8(IGNITE_TYPE_STRING);
+
+ PortableUtils::WriteString(stream, obj0, len);
+ }
+ }
+ }
+}
+
+#endif
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/58a665aa/modules/platform/src/main/cpp/core/include/ignite/portable/portable.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/core/include/ignite/portable/portable.h b/modules/platform/src/main/cpp/core/include/ignite/portable/portable.h
new file mode 100644
index 0000000..1a7c3dd
--- /dev/null
+++ b/modules/platform/src/main/cpp/core/include/ignite/portable/portable.h
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_PORTABLE
+#define _IGNITE_PORTABLE
+
+#include "ignite/portable/portable_consts.h"
+#include "ignite/portable/portable_containers.h"
+#include "ignite/portable/portable_type.h"
+#include "ignite/portable/portable_raw_reader.h"
+#include "ignite/portable/portable_raw_writer.h"
+#include "ignite/portable/portable_reader.h"
+#include "ignite/portable/portable_writer.h"
+
+#endif
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/58a665aa/modules/platform/src/main/cpp/core/include/ignite/portable/portable_consts.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/core/include/ignite/portable/portable_consts.h b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_consts.h
new file mode 100644
index 0000000..ef6db45
--- /dev/null
+++ b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_consts.h
@@ -0,0 +1,106 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_PORTABLE_CONSTS
+#define _IGNITE_PORTABLE_CONSTS
+
+#include <ignite/common/common.h>
+
+namespace ignite
+{
+ namespace portable
+ {
+ /**
+ * Portable collection types.
+ */
+ enum CollectionType
+ {
+ /**
+ * Undefined. Maps to ArrayList in Java.
+ */
+ IGNITE_COLLECTION_UNDEFINED = 0,
+
+ /**
+ * Array list. Maps to ArrayList in Java.
+ */
+ IGNITE_COLLECTION_ARRAY_LIST = 1,
+
+ /**
+ * Linked list. Maps to LinkedList in Java.
+ */
+ IGNITE_COLLECTION_LINKED_LIST = 2,
+
+ /**
+ * Hash set. Maps to HashSet in Java.
+ */
+ IGNITE_COLLECTION_HASH_SET = 3,
+
+ /**
+ * Linked hash set. Maps to LinkedHashSet in Java.
+ */
+ IGNITE_COLLECTION_LINKED_HASH_SET = 4,
+
+ /**
+ * Tree set. Maps to TreeSet in Java.
+ */
+ IGNITE_COLLECTION_TREE_SET = 5,
+
+ /**
+ * Concurrent skip list set. Maps to ConcurrentSkipListSet in Java.
+ */
+ IGNITE_COLLECTION_CONCURRENT_SKIP_LIST_SET = 6
+ };
+
+ /**
+ * Portable map types.
+ */
+ enum MapType
+ {
+ /**
+ * Undefined. Maps to HashMap in Java.
+ */
+ IGNITE_MAP_UNDEFINED = 0,
+
+ /**
+ * Hash map. Maps to HashMap in Java.
+ */
+ IGNITE_MAP_HASH_MAP = 1,
+
+ /**
+ * Linked hash map. Maps to LinkedHashMap in Java.
+ */
+ IGNITE_MAP_LINKED_HASH_MAP = 2,
+
+ /**
+ * Tree map. Maps to TreeMap in Java.
+ */
+ IGNITE_MAP_TREE_MAP = 3,
+
+ /**
+ * Concurrent hash map. Maps to ConcurrentHashMap in Java.
+ */
+ IGNITE_MAP_CONCURRENT_HASH_MAP = 4,
+
+ /**
+ * Properties map. Maps to Properties in Java.
+ */
+ IGNITE_MAP_PROPERTIES_MAP = 5
+ };
+ }
+}
+
+#endif
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/58a665aa/modules/platform/src/main/cpp/core/include/ignite/portable/portable_containers.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/core/include/ignite/portable/portable_containers.h b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_containers.h
new file mode 100644
index 0000000..f93a11a
--- /dev/null
+++ b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_containers.h
@@ -0,0 +1,525 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_PORTABLE_CONTAINERS
+#define _IGNITE_PORTABLE_CONTAINERS
+
+#include <stdint.h>
+
+#include "ignite/impl/portable/portable_writer_impl.h"
+#include "ignite/impl/portable/portable_reader_impl.h"
+#include "ignite/impl/utils.h"
+#include "ignite/portable/portable_consts.h"
+
+namespace ignite
+{
+ namespace portable
+ {
+ /**
+ * Portable string array writer.
+ */
+ class IGNITE_IMPORT_EXPORT PortableStringArrayWriter
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param id Identifier.
+ * @param impl Writer.
+ */
+ PortableStringArrayWriter(impl::portable::PortableWriterImpl* impl, const int32_t id);
+
+ /**
+ * Write string.
+ *
+ * @param val Null-terminated character sequence.
+ */
+ void Write(const char* val);
+
+ /**
+ * Write string.
+ *
+ * @param val String.
+ * @param len String length (characters).
+ */
+ void Write(const char* val, const int32_t len);
+
+ /**
+ * Write string.
+ *
+ * @param val String.
+ */
+ void Write(const std::string& val)
+ {
+ Write(val.c_str());
+ }
+
+ /**
+ * Close the writer.
+ */
+ void Close();
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableWriterImpl* impl;
+
+ /** Idnetifier. */
+ const int32_t id;
+ };
+
+ /**
+ * Portable collection writer.
+ */
+ template<typename T>
+ class IGNITE_IMPORT_EXPORT PortableArrayWriter
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Writer.
+ * @param id Identifier.
+ */
+ PortableArrayWriter(impl::portable::PortableWriterImpl* impl, const int32_t id) : impl(impl), id(id)
+ {
+ // No-op.
+ }
+
+ /**
+ * Write a value.
+ *
+ * @param val Value.
+ */
+ void Write(const T& val)
+ {
+ impl->WriteElement<T>(id, val);
+ }
+
+ /**
+ * Close the writer.
+ */
+ void Close()
+ {
+ impl->CommitContainer(id);
+ }
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableWriterImpl* impl;
+
+ /** Idnetifier. */
+ const int32_t id;
+ };
+
+ /**
+ * Portable collection writer.
+ */
+ template<typename T>
+ class IGNITE_IMPORT_EXPORT PortableCollectionWriter
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Writer.
+ * @param id Identifier.
+ */
+ PortableCollectionWriter(impl::portable::PortableWriterImpl* impl, const int32_t id) : impl(impl), id(id)
+ {
+ // No-op.
+ }
+
+ /**
+ * Write a value.
+ *
+ * @param val Value.
+ */
+ void Write(const T& val)
+ {
+ impl->WriteElement<T>(id, val);
+ }
+
+ /**
+ * Close the writer.
+ */
+ void Close()
+ {
+ impl->CommitContainer(id);
+ }
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableWriterImpl* impl;
+
+ /** Identifier. */
+ const int32_t id;
+ };
+
+ /**
+ * Portable map writer.
+ */
+ template<typename K, typename V>
+ class IGNITE_IMPORT_EXPORT PortableMapWriter
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Writer.
+ */
+ PortableMapWriter(impl::portable::PortableWriterImpl* impl, const int32_t id) : impl(impl), id(id)
+ {
+ // No-op.
+ }
+
+ /**
+ * Write a value.
+ *
+ * @param key Key.
+ * @param val Value.
+ */
+ void Write(const K& key, const V& val)
+ {
+ impl->WriteElement<K, V>(id, key, val);
+ }
+
+ /**
+ * Close the writer.
+ */
+ void Close()
+ {
+ impl->CommitContainer(id);
+ }
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableWriterImpl* impl;
+
+ /** Identifier. */
+ const int32_t id;
+ };
+
+ /**
+ * Portable string array reader.
+ */
+ class IGNITE_IMPORT_EXPORT PortableStringArrayReader
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Reader.
+ * @param id Identifier.
+ * @param size Array size.
+ */
+ PortableStringArrayReader(impl::portable::PortableReaderImpl* impl, const int32_t id, const int32_t size);
+
+ /**
+ * Check whether next element is available for read.
+ *
+ * @return True if available.
+ */
+ bool HasNext();
+
+ /**
+ * Get next element.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of string. NULL terminator will be set in case len is
+ * greater than real string length.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t GetNext(char* res, const int32_t len);
+
+ /**
+ * Get next element.
+ *
+ * @return String.
+ */
+ std::string GetNext()
+ {
+ int32_t len = GetNext(NULL, 0);
+
+ if (len != -1)
+ {
+ impl::utils::SafeArray<char> arr(len + 1);
+
+ GetNext(arr.target, len + 1);
+
+ return std::string(arr.target);
+ }
+ else
+ return std::string();
+ }
+
+ /**
+ * Get array size.
+ *
+ * @return Size or -1 if array is NULL.
+ */
+ int32_t GetSize();
+
+ /**
+ * Whether array is NULL.
+ */
+ bool IsNull();
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableReaderImpl* impl;
+
+ /** Identifier. */
+ const int32_t id;
+
+ /** Size. */
+ const int32_t size;
+ };
+
+ /**
+ * Portable array reader.
+ */
+ template<typename T>
+ class PortableArrayReader
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Reader.
+ * @param id Identifier.
+ * @param size Array size.
+ */
+ PortableArrayReader(impl::portable::PortableReaderImpl* impl, const int32_t id, const int32_t size) :
+ impl(impl), id(id), size(size)
+ {
+ // No-op.
+ }
+
+ /**
+ * Check whether next element is available for read.
+ *
+ * @return True if available.
+ */
+ bool HasNext()
+ {
+ return impl->HasNextElement(id);
+ }
+
+ /**
+ * Read next element.
+ *
+ * @return Next element.
+ */
+ T GetNext()
+ {
+ return impl->ReadElement<T>(id);
+ }
+
+ /**
+ * Get array size.
+ *
+ * @return Size or -1 if array is NULL.
+ */
+ int32_t GetSize()
+ {
+ return size;
+ }
+
+ /**
+ * Whether array is NULL.
+ */
+ bool IsNull()
+ {
+ return size == -1;
+ }
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableReaderImpl* impl;
+
+ /** Identifier. */
+ const int32_t id;
+
+ /** Size. */
+ const int32_t size;
+ };
+
+ /**
+ * Portable collection reader.
+ */
+ template<typename T>
+ class PortableCollectionReader
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Reader.
+ * @param id Identifier.
+ * @param type Collection type.
+ * @param size Collection size.
+ */
+ PortableCollectionReader(impl::portable::PortableReaderImpl* impl, const int32_t id,
+ const CollectionType type, const int32_t size) : impl(impl), id(id), type(type), size(size)
+ {
+ // No-op.
+ }
+
+ /**
+ * Check whether next element is available for read.
+ *
+ * @return True if available.
+ */
+ bool HasNext()
+ {
+ return impl->HasNextElement(id);
+ }
+
+ /**
+ * Read next element.
+ *
+ * @return Next element.
+ */
+ T GetNext()
+ {
+ return impl->ReadElement<T>(id);
+ }
+
+ /**
+ * Get collection type.
+ *
+ * @return Type.
+ */
+ CollectionType GetType()
+ {
+ return type;
+ }
+
+ /**
+ * Get collection size.
+ *
+ * @return Size or -1 if collection is NULL.
+ */
+ int32_t GetSize()
+ {
+ return size;
+ }
+
+ /**
+ * Whether collection is NULL.
+ */
+ bool IsNull()
+ {
+ return size == -1;
+ }
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableReaderImpl* impl;
+
+ /** Identifier. */
+ const int32_t id;
+
+ /** Collection type. */
+ const CollectionType type;
+
+ /** Size. */
+ const int32_t size;
+ };
+
+ /**
+ * Portable map reader.
+ */
+ template<typename K, typename V>
+ class PortableMapReader
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Reader.
+ * @param id Identifier.
+ * @param type Map type.
+ * @param size Map size.
+ */
+ PortableMapReader(impl::portable::PortableReaderImpl* impl, const int32_t id, const MapType type,
+ const int32_t size) : impl(impl), id(id), type(type), size(size)
+ {
+ // No-op.
+ }
+
+ /**
+ * Check whether next element is available for read.
+ *
+ * @return True if available.
+ */
+ bool HasNext()
+ {
+ return impl->HasNextElement(id);
+ }
+
+ /**
+ * Read next element.
+ *
+ * @param key Key.
+ * @param val Value.
+ */
+ void GetNext(K* key, V* val)
+ {
+ return impl->ReadElement<K, V>(id, key, val);
+ }
+
+ /**
+ * Get map type.
+ *
+ * @return Type.
+ */
+ MapType GetType()
+ {
+ return type;
+ }
+
+ /**
+ * Get map size.
+ *
+ * @return Size or -1 if map is NULL.
+ */
+ int32_t GetSize()
+ {
+ return size;
+ }
+
+ /**
+ * Whether map is NULL.
+ */
+ bool IsNull()
+ {
+ return size == -1;
+ }
+ private:
+ /** Implementation delegate. */
+ impl::portable::PortableReaderImpl* impl;
+
+ /** Identifier. */
+ const int32_t id;
+
+ /** Map type. */
+ const MapType type;
+
+ /** Size. */
+ const int32_t size;
+ };
+ }
+}
+
+#endif
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/58a665aa/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_reader.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_reader.h b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_reader.h
new file mode 100644
index 0000000..9f1d74c
--- /dev/null
+++ b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_reader.h
@@ -0,0 +1,324 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_PORTABLE_RAW_READER
+#define _IGNITE_PORTABLE_RAW_READER
+
+#include <stdint.h>
+#include <string>
+
+#include <ignite/common/common.h>
+
+#include "ignite/impl/portable/portable_reader_impl.h"
+#include "ignite/portable/portable_consts.h"
+#include "ignite/portable/portable_containers.h"
+#include "ignite/guid.h"
+
+namespace ignite
+{
+ namespace portable
+ {
+ /**
+ * Portable raw reader.
+ */
+ class IGNITE_IMPORT_EXPORT PortableRawReader
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Implementation.
+ */
+ PortableRawReader(ignite::impl::portable::PortableReaderImpl* impl);
+
+ /**
+ * Read 8-byte signed integer. Maps to "byte" type in Java.
+ *
+ * @return Result.
+ */
+ int8_t ReadInt8();
+
+ /**
+ * Read array of 8-byte signed integers. Maps to "byte[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt8Array(int8_t* res, const int32_t len);
+
+ /**
+ * Read bool. Maps to "boolean" type in Java.
+ *
+ * @return Result.
+ */
+ bool ReadBool();
+
+ /**
+ * Read array of bools. Maps to "boolean[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadBoolArray(bool* res, const int32_t len);
+
+ /**
+ * Read 16-byte signed integer. Maps to "short" type in Java.
+ *
+ * @return Result.
+ */
+ int16_t ReadInt16();
+
+ /**
+ * Read array of 16-byte signed integers. Maps to "short[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt16Array(int16_t* res, const int32_t len);
+
+ /**
+ * Read 16-byte unsigned integer. Maps to "char" type in Java.
+ *
+ * @return Result.
+ */
+ uint16_t ReadUInt16();
+
+ /**
+ * Read array of 16-byte unsigned integers. Maps to "char[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadUInt16Array(uint16_t* res, const int32_t len);
+
+ /**
+ * Read 32-byte signed integer. Maps to "int" type in Java.
+ *
+ * @return Result.
+ */
+ int32_t ReadInt32();
+
+ /**
+ * Read array of 32-byte signed integers. Maps to "int[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt32Array(int32_t* res, const int32_t len);
+
+ /**
+ * Read 64-byte signed integer. Maps to "long" type in Java.
+ *
+ * @return Result.
+ */
+ int64_t ReadInt64();
+
+ /**
+ * Read array of 64-byte signed integers. Maps to "long[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt64Array(int64_t* res, const int32_t len);
+
+ /**
+ * Read float. Maps to "float" type in Java.
+ *
+ * @return Result.
+ */
+ float ReadFloat();
+
+ /**
+ * Read array of floats. Maps to "float[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadFloatArray(float* res, const int32_t len);
+
+ /**
+ * Read double. Maps to "double" type in Java.
+ *
+ * @return Result.
+ */
+ double ReadDouble();
+
+ /**
+ * Read array of doubles. Maps to "double[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadDoubleArray(double* res, const int32_t len);
+
+ /**
+ * Read Guid. Maps to "UUID" type in Java.
+ *
+ * @return Result.
+ */
+ Guid ReadGuid();
+
+ /**
+ * Read array of Guids. Maps to "UUID[]" type in Java.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadGuidArray(Guid* res, const int32_t len);
+
+ /**
+ * Read string.
+ *
+ * @param res Array to store data to.
+ * @param len Expected length of string. NULL terminator will be set in case len is
+ * greater than real string length.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadString(char* res, const int32_t len);
+
+ /**
+ * Read string from the stream.
+ *
+ * @return String.
+ */
+ std::string ReadString()
+ {
+ int32_t len = ReadString(NULL, 0);
+
+ if (len != -1)
+ {
+ ignite::impl::utils::SafeArray<char> arr(len + 1);
+
+ ReadString(arr.target, len + 1);
+
+ return std::string(arr.target);
+ }
+ else
+ return std::string();
+ }
+
+ /**
+ * Start string array read.
+ *
+ * @return String array reader.
+ */
+ PortableStringArrayReader ReadStringArray();
+
+ /**
+ * Start array read.
+ *
+ * @return Array reader.
+ */
+ template<typename T>
+ PortableArrayReader<T> ReadArray()
+ {
+ int32_t size;
+
+ int32_t id = impl->ReadArray(&size);
+
+ return PortableArrayReader<T>(impl, id, size);
+ }
+
+ /**
+ * Start collection read.
+ *
+ * @return Collection reader.
+ */
+ template<typename T>
+ PortableCollectionReader<T> ReadCollection()
+ {
+ CollectionType typ;
+ int32_t size;
+
+ int32_t id = impl->ReadCollection(&typ, &size);
+
+ return PortableCollectionReader<T>(impl, id, typ, size);
+ }
+
+ /**
+ * Start map read.
+ *
+ * @return Map reader.
+ */
+ template<typename K, typename V>
+ PortableMapReader<K, V> ReadMap()
+ {
+ MapType typ;
+ int32_t size;
+
+ int32_t id = impl->ReadMap(&typ, &size);
+
+ return PortableMapReader<K, V>(impl, id, typ, size);
+ }
+
+ /**
+ * Read object.
+ *
+ * @return Object.
+ */
+ template<typename T>
+ T ReadObject()
+ {
+ return impl->ReadObject<T>();
+ }
+ private:
+ /** Implementation delegate. */
+ ignite::impl::portable::PortableReaderImpl* impl;
+ };
+ }
+}
+
+#endif
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/58a665aa/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_writer.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_writer.h b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_writer.h
new file mode 100644
index 0000000..47b5880
--- /dev/null
+++ b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_raw_writer.h
@@ -0,0 +1,300 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_PORTABLE_RAW_WRITER
+#define _IGNITE_PORTABLE_RAW_WRITER
+
+#include <stdint.h>
+
+#include <ignite/common/common.h>
+
+#include "ignite/impl/portable/portable_writer_impl.h"
+#include "ignite/portable/portable_consts.h"
+#include "ignite/portable/portable_containers.h"
+#include "ignite/guid.h"
+
+namespace ignite
+{
+ namespace portable
+ {
+ /**
+ * Portable raw writer.
+ */
+ class IGNITE_IMPORT_EXPORT PortableRawWriter
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Implementation.
+ */
+ PortableRawWriter(ignite::impl::portable::PortableWriterImpl* impl);
+
+ /**
+ * Write 8-byte signed integer. Maps to "byte" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt8(const int8_t val);
+
+ /**
+ * Write array of 8-byte signed integers. Maps to "byte[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt8Array(const int8_t* val, const int32_t len);
+
+ /**
+ * Write bool. Maps to "short" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteBool(const bool val);
+
+ /**
+ * Write array of bools. Maps to "bool[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteBoolArray(const bool* val, const int32_t len);
+
+ /**
+ * Write 16-byte signed integer. Maps to "short" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt16(const int16_t val);
+
+ /**
+ * Write array of 16-byte signed integers. Maps to "short[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt16Array(const int16_t* val, const int32_t len);
+
+ /**
+ * Write 16-byte unsigned integer. Maps to "char" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteUInt16(const uint16_t val);
+
+ /**
+ * Write array of 16-byte unsigned integers. Maps to "char[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteUInt16Array(const uint16_t* val, const int32_t len);
+
+ /**
+ * Write 32-byte signed integer. Maps to "int" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt32(const int32_t val);
+
+ /**
+ * Write array of 32-byte signed integers. Maps to "int[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt32Array(const int32_t* val, const int32_t len);
+
+ /**
+ * Write 64-byte signed integer. Maps to "long" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteInt64(const int64_t val);
+
+ /**
+ * Write array of 64-byte signed integers. Maps to "long[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteInt64Array(const int64_t* val, const int32_t len);
+
+ /**
+ * Write float. Maps to "float" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteFloat(const float val);
+
+ /**
+ * Write array of floats. Maps to "float[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteFloatArray(const float* val, const int32_t len);
+
+ /**
+ * Write double. Maps to "double" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteDouble(const double val);
+
+ /**
+ * Write array of doubles. Maps to "double[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteDoubleArray(const double* val, const int32_t len);
+
+ /**
+ * Write Guid. Maps to "UUID" type in Java.
+ *
+ * @param val Value.
+ */
+ void WriteGuid(const Guid val);
+
+ /**
+ * Write array of Guids. Maps to "UUID[]" type in Java.
+ *
+ * @param val Array.
+ * @param len Array length.
+ */
+ void WriteGuidArray(const Guid* val, const int32_t len);
+
+ /**
+ * Write string.
+ *
+ * @param val Null-terminated character array.
+ */
+ void WriteString(const char* val);
+
+ /**
+ * Write string.
+ *
+ * @param val String.
+ * @param len String length (characters).
+ */
+ void WriteString(const char* val, const int32_t len);
+
+ /**
+ * Write string.
+ *
+ * @param val String.
+ */
+ void WriteString(const std::string& val)
+ {
+ WriteString(val.c_str());
+ }
+
+ /**
+ * Start string array write.
+ *
+ * @return String array writer.
+ */
+ PortableStringArrayWriter WriteStringArray();
+
+ /**
+ * Write NULL value.
+ */
+ void WriteNull();
+
+ /**
+ * Start array write.
+ *
+ * @return Array writer.
+ */
+ template<typename T>
+ PortableArrayWriter<T> WriteArray()
+ {
+ int32_t id = impl->WriteArray();
+
+ return PortableArrayWriter<T>(impl, id);
+ }
+
+ /**
+ * Start collection write.
+ *
+ * @return Collection writer.
+ */
+ template<typename T>
+ PortableCollectionWriter<T> WriteCollection()
+ {
+ return WriteCollection<T>(IGNITE_COLLECTION_UNDEFINED);
+ }
+
+ /**
+ * Start collection write.
+ *
+ * @param type Collection type.
+ * @return Collection writer.
+ */
+ template<typename T>
+ PortableCollectionWriter<T> WriteCollection(ignite::portable::CollectionType typ)
+ {
+ int32_t id = impl->WriteCollection(typ);
+
+ return PortableCollectionWriter<T>(impl, id);
+ }
+
+ /**
+ * Start map write.
+ *
+ * @param typ Map type.
+ * @return Map writer.
+ */
+ template<typename K, typename V>
+ PortableMapWriter<K, V> WriteMap()
+ {
+ return WriteMap<K, V>(IGNITE_MAP_UNDEFINED);
+ }
+
+ /**
+ * Start map write.
+ *
+ * @param typ Map type.
+ * @return Map writer.
+ */
+ template<typename K, typename V>
+ PortableMapWriter<K, V> WriteMap(ignite::portable::MapType typ)
+ {
+ int32_t id = impl->WriteMap(typ);
+
+ return PortableMapWriter<K, V>(impl, id);
+ }
+
+ /**
+ * Write object.
+ *
+ * @param val Object.
+ */
+ template<typename T>
+ void WriteObject(T val)
+ {
+ impl->WriteObject<T>(val);
+ }
+ private:
+ /** Implementation delegate. */
+ ignite::impl::portable::PortableWriterImpl* impl;
+ };
+ }
+}
+
+#endif
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/58a665aa/modules/platform/src/main/cpp/core/include/ignite/portable/portable_reader.h
----------------------------------------------------------------------
diff --git a/modules/platform/src/main/cpp/core/include/ignite/portable/portable_reader.h b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_reader.h
new file mode 100644
index 0000000..5e4b7ad
--- /dev/null
+++ b/modules/platform/src/main/cpp/core/include/ignite/portable/portable_reader.h
@@ -0,0 +1,355 @@
+/*
+ * 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.
+ */
+
+#ifndef _IGNITE_PORTABLE_READER
+#define _IGNITE_PORTABLE_READER
+
+#include <stdint.h>
+#include <string>
+
+#include <ignite/common/common.h>
+
+#include "ignite/portable/portable_raw_reader.h"
+#include "ignite/guid.h"
+
+namespace ignite
+{
+ namespace portable
+ {
+ /**
+ * Portable reader.
+ */
+ class IGNITE_IMPORT_EXPORT PortableReader
+ {
+ public:
+ /**
+ * Constructor.
+ *
+ * @param impl Implementation.
+ */
+ PortableReader(ignite::impl::portable::PortableReaderImpl* impl);
+
+ /**
+ * Read 8-byte signed integer. Maps to "byte" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ int8_t ReadInt8(const char* fieldName);
+
+ /**
+ * Read array of 8-byte signed integers. Maps to "byte[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt8Array(const char* fieldName, int8_t* res, const int32_t len);
+
+ /**
+ * Read bool. Maps to "short" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ bool ReadBool(const char* fieldName);
+
+ /**
+ * Read array of bools. Maps to "bool[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadBoolArray(const char* fieldName, bool* res, const int32_t len);
+
+ /**
+ * Read 16-byte signed integer. Maps to "short" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ int16_t ReadInt16(const char* fieldName);
+
+ /**
+ * Read array of 16-byte signed integers. Maps to "short[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt16Array(const char* fieldName, int16_t* res, const int32_t len);
+
+ /**
+ * Read 16-byte unsigned integer. Maps to "char" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ uint16_t ReadUInt16(const char* fieldName);
+
+ /**
+ * Read array of 16-byte unsigned integers. Maps to "char[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadUInt16Array(const char* fieldName, uint16_t* res, const int32_t len);
+
+ /**
+ * Read 32-byte signed integer. Maps to "int" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ int32_t ReadInt32(const char* fieldName);
+
+ /**
+ * Read array of 32-byte signed integers. Maps to "int[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt32Array(const char* fieldName, int32_t* res, const int32_t len);
+
+ /**
+ * Read 64-byte signed integer. Maps to "long" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ int64_t ReadInt64(const char* fieldName);
+
+ /**
+ * Read array of 64-byte signed integers. Maps to "long[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadInt64Array(const char* fieldName, int64_t* res, const int32_t len);
+
+ /**
+ * Read float. Maps to "float" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ float ReadFloat(const char* fieldName);
+
+ /**
+ * Read array of floats. Maps to "float[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadFloatArray(const char* fieldName, float* res, const int32_t len);
+
+ /**
+ * Read double. Maps to "double" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ double ReadDouble(const char* fieldName);
+
+ /**
+ * Read array of doubles. Maps to "double[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadDoubleArray(const char* fieldName, double* res, const int32_t len);
+
+ /**
+ * Read Guid. Maps to "UUID" type in Java.
+ *
+ * @param fieldName Field name.
+ * @return Result.
+ */
+ Guid ReadGuid(const char* fieldName);
+
+ /**
+ * Read array of Guids. Maps to "UUID[]" type in Java.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of array.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadGuidArray(const char* fieldName, Guid* res, const int32_t len);
+
+ /**
+ * Read string.
+ *
+ * @param fieldName Field name.
+ * @param res Array to store data to.
+ * @param len Expected length of string. NULL terminator will be set in case len is
+ * greater than real string length.
+ * @return Actual amount of elements read. If "len" argument is less than actual
+ * array size or resulting array is set to null, nothing will be written
+ * to resulting array and returned value will contain required array length.
+ * -1 will be returned in case array in stream was null.
+ */
+ int32_t ReadString(const char* fieldName, char* res, const int32_t len);
+
+ /**
+ * Read string from the stream.
+ *
+ * @param fieldName Field name.
+ * @return String.
+ */
+ std::string ReadString(const char* fieldName)
+ {
+ int32_t len = ReadString(fieldName, NULL, 0);
+
+ if (len != -1)
+ {
+ ignite::impl::utils::SafeArray<char> arr(len + 1);
+
+ ReadString(fieldName, arr.target, len + 1);
+
+ return std::string(arr.target);
+ }
+ else
+ return std::string();
+ }
+
+ /**
+ * Start string array read.
+ *
+ * @param fieldName Field name.
+ * @return String array reader.
+ */
+ PortableStringArrayReader ReadStringArray(const char* fieldName);
+
+ /**
+ * Start array read.
+ *
+ * @param fieldName Field name.
+ * @return Array reader.
+ */
+ template<typename T>
+ PortableArrayReader<T> ReadArray(const char* fieldName)
+ {
+ int32_t size;
+
+ int32_t id = impl->ReadArray(fieldName, &size);
+
+ return PortableArrayReader<T>(impl, id, size);
+ }
+
+ /**
+ * Start collection read.
+ *
+ * @param fieldName Field name.
+ * @return Collection reader.
+ */
+ template<typename T>
+ PortableCollectionReader<T> ReadCollection(const char* fieldName)
+ {
+ CollectionType typ;
+ int32_t size;
+
+ int32_t id = impl->ReadCollection(fieldName, &typ, &size);
+
+ return PortableCollectionReader<T>(impl, id, typ, size);
+ }
+
+ /**
+ * Start map read.
+ *
+ * @param fieldName Field name.
+ * @return Map reader.
+ */
+ template<typename K, typename V>
+ PortableMapReader<K, V> ReadMap(const char* fieldName)
+ {
+ MapType typ;
+ int32_t size;
+
+ int32_t id = impl->ReadMap(fieldName, &typ, &size);
+
+ return PortableMapReader<K, V>(impl, id, typ, size);
+ }
+
+ /**
+ * Read object.
+ *
+ * @param fieldName Field name.
+ * @return Object.
+ */
+ template<typename T>
+ T ReadObject(const char* fieldName)
+ {
+ return impl->ReadObject<T>(fieldName);
+ }
+
+ /**
+ * Get raw reader for this reader.
+ *
+ * @return Raw reader.
+ */
+ PortableRawReader RawReader();
+ private:
+ /** Implementation delegate. */
+ ignite::impl::portable::PortableReaderImpl* impl;
+ };
+ }
+}
+
+#endif
\ No newline at end of file