1 //
2 // Copyright (c) ZeroC, Inc. All rights reserved.
3 //
4 
5 #include <Ice/SlicedData.h>
6 #include <Ice/OutputStream.h>
7 #include <Ice/InputStream.h>
8 
9 using namespace std;
10 using namespace Ice;
11 
12 #ifndef ICE_CPP11_MAPPING
upCast(SliceInfo * p)13 IceUtil::Shared* Ice::upCast(SliceInfo* p) { return p; }
upCast(SlicedData * p)14 IceUtil::Shared* Ice::upCast(SlicedData* p) { return p; }
upCast(UnknownSlicedValue * p)15 IceUtil::Shared* Ice::upCast(UnknownSlicedValue* p) { return p; }
16 
~SlicedData()17 Ice::SlicedData::~SlicedData()
18 {
19     // Out of line to avoid weak vtable
20 }
21 #endif
22 
SlicedData(const SliceInfoSeq & seq)23 Ice::SlicedData::SlicedData(const SliceInfoSeq& seq) :
24     slices(seq)
25 {
26 }
27 
28 void
clear()29 Ice::SlicedData::clear()
30 {
31     SliceInfoSeq tmp;
32     tmp.swap(const_cast<SliceInfoSeq&>(slices));
33     for(SliceInfoSeq::const_iterator p = tmp.begin(); p != tmp.end(); ++p)
34     {
35         for(vector<ValuePtr>::const_iterator q = (*p)->instances.begin(); q != (*p)->instances.end(); ++q)
36         {
37             Ice::SlicedDataPtr slicedData = (*q)->ice_getSlicedData();
38             if(slicedData)
39             {
40                 slicedData->clear();
41             }
42         }
43     }
44 }
45 
46 #ifndef ICE_CPP11_MAPPING
47 void
_iceGcVisitMembers(IceInternal::GCVisitor & visitor)48 Ice::SlicedData::_iceGcVisitMembers(IceInternal::GCVisitor& visitor)
49 {
50     //
51     // Iterate over the object references in each preserved slice.
52     //
53     for(SliceInfoSeq::const_iterator p = slices.begin(); p != slices.end(); ++p)
54     {
55         for(vector<ObjectPtr>::iterator q = (*p)->instances.begin(); q != (*p)->instances.end(); ++q)
56         {
57             if(q->get()->_iceGcVisit(visitor))
58             {
59                 *q = 0;
60             }
61         }
62     }
63 }
64 #endif
65 
UnknownSlicedValue(const string & unknownTypeId)66 Ice::UnknownSlicedValue::UnknownSlicedValue(const string& unknownTypeId) : _unknownTypeId(unknownTypeId)
67 {
68 }
69 
70 SlicedDataPtr
ice_getSlicedData() const71 Ice::UnknownSlicedValue::ice_getSlicedData() const
72 {
73     return _slicedData;
74 }
75 
76 #ifdef ICE_CPP11_MAPPING
77 
78 string
ice_id() const79 Ice::UnknownSlicedValue::ice_id() const
80 {
81     return _unknownTypeId;
82 }
83 
84 shared_ptr<Ice::UnknownSlicedValue>
ice_clone() const85 Ice::UnknownSlicedValue::ice_clone() const
86 {
87     return static_pointer_cast<UnknownSlicedValue>(_iceCloneImpl());
88 }
89 
90 shared_ptr<Ice::Value>
_iceCloneImpl() const91 Ice::UnknownSlicedValue::_iceCloneImpl() const
92 {
93     return make_shared<UnknownSlicedValue>(static_cast<const UnknownSlicedValue&>(*this));
94 }
95 
96 #else
97 
98 const string&
ice_id(const Current &) const99 Ice::UnknownSlicedValue::ice_id(const Current&) const
100 {
101     return _unknownTypeId;
102 }
103 
104 void
_iceGcVisitMembers(IceInternal::GCVisitor & _v)105 Ice::UnknownSlicedValue::_iceGcVisitMembers(IceInternal::GCVisitor& _v)
106 {
107     if(_slicedData)
108     {
109         _slicedData->_iceGcVisitMembers(_v);
110     }
111 }
112 
113 #endif
114 
115 void
_iceWrite(Ice::OutputStream * ostr) const116 Ice::UnknownSlicedValue::_iceWrite(Ice::OutputStream* ostr) const
117 {
118     ostr->startValue(_slicedData);
119     ostr->endValue();
120 }
121 
122 void
_iceRead(Ice::InputStream * istr)123 Ice::UnknownSlicedValue::_iceRead(Ice::InputStream* istr)
124 {
125     istr->startValue();
126     _slicedData = istr->endValue(true);
127 }
128