summaryrefslogtreecommitdiff
path: root/cpp/include/Ice/SlicedData.h
blob: 2b005d2b01aebd799dc1d3d2125c862914d18b4b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// **********************************************************************
//
// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************

#ifndef ICE_SLICED_DATA_H
#define ICE_SLICED_DATA_H

#include <Ice/SlicedDataF.h>
#include <Ice/GCObject.h>
#include <Ice/Value.h>

namespace Ice
{

//
// SliceInfo encapsulates the details of a slice for an unknown class or exception type.
//
struct ICE_API SliceInfo
#ifndef ICE_CPP11_MAPPING
    : public ::IceUtil::Shared
#endif
{
    //
    // The Slice type ID for this slice.
    //
    ::std::string typeId;

    //
    // The Slice compact type ID for this slice.
    //
    int compactId;

    //
    // The encoded bytes for this slice, including the leading size integer.
    //
    ::std::vector<Byte> bytes;

    //
    // The class instances referenced by this slice.
    //
    ::std::vector<ValuePtr> instances;

    //
    // Whether or not the slice contains optional members.
    //
    bool hasOptionalMembers;

    //
    // Whether or not this is the last slice.
    //
    bool isLastSlice;
};

//
// SlicedData holds the slices of unknown types.
//
class ICE_API SlicedData
#ifndef ICE_CPP11_MAPPING
    : public ::IceUtil::Shared
#endif
{
public:

#ifndef ICE_CPP11_MAPPING
    virtual ~SlicedData();
#endif

    SlicedData(const SliceInfoSeq&);

    const SliceInfoSeq slices;
#ifndef ICE_CPP11_MAPPING
    void __gcVisitMembers(IceInternal::GCVisitor&);
#endif
};

//
// Unknown sliced object holds instance of unknown type.
//
class ICE_API UnknownSlicedValue :
#if defined(ICE_CPP11_MAPPING)
    public ValueHelper<UnknownSlicedValue, Value>
#elif defined(__IBMCPP__)
// xlC does not handle properly the public/private multiple inheritance from Object
    public IceInternal::GCObject
#else
    virtual public Object, private IceInternal::GCObject
#endif
{
public:

    UnknownSlicedValue(const std::string&);

    const std::string& getUnknownTypeId() const;

    SlicedDataPtr getSlicedData() const;

#ifndef ICE_CPP11_MAPPING
    virtual void __gcVisitMembers(IceInternal::GCVisitor&);
#endif

    virtual void __write(::Ice::OutputStream*) const;
    virtual void __read(::Ice::InputStream*);

private:

    const std::string _unknownTypeId;
    SlicedDataPtr _slicedData;
};

#if defined(ICE_CPP11_MAPPING)
template<typename S>
struct StreamWriter<UnknownSlicedValue, S>
{
    static void write(S* __os, const UnknownSlicedValue& v) { }
};
template<typename S>
struct StreamReader<UnknownSlicedValue, S>
{
    static void read(S* __is, UnknownSlicedValue& v) { }
};
#endif

}

#endif