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)13IceUtil::Shared* Ice::upCast(SliceInfo* p) { return p; } upCast(SlicedData * p)14IceUtil::Shared* Ice::upCast(SlicedData* p) { return p; } upCast(UnknownSlicedValue * p)15IceUtil::Shared* Ice::upCast(UnknownSlicedValue* p) { return p; } 16 ~SlicedData()17Ice::SlicedData::~SlicedData() 18 { 19 // Out of line to avoid weak vtable 20 } 21 #endif 22 SlicedData(const SliceInfoSeq & seq)23Ice::SlicedData::SlicedData(const SliceInfoSeq& seq) : 24 slices(seq) 25 { 26 } 27 28 void clear()29Ice::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)48Ice::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)66Ice::UnknownSlicedValue::UnknownSlicedValue(const string& unknownTypeId) : _unknownTypeId(unknownTypeId) 67 { 68 } 69 70 SlicedDataPtr ice_getSlicedData() const71Ice::UnknownSlicedValue::ice_getSlicedData() const 72 { 73 return _slicedData; 74 } 75 76 #ifdef ICE_CPP11_MAPPING 77 78 string ice_id() const79Ice::UnknownSlicedValue::ice_id() const 80 { 81 return _unknownTypeId; 82 } 83 84 shared_ptr<Ice::UnknownSlicedValue> ice_clone() const85Ice::UnknownSlicedValue::ice_clone() const 86 { 87 return static_pointer_cast<UnknownSlicedValue>(_iceCloneImpl()); 88 } 89 90 shared_ptr<Ice::Value> _iceCloneImpl() const91Ice::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 &) const99Ice::UnknownSlicedValue::ice_id(const Current&) const 100 { 101 return _unknownTypeId; 102 } 103 104 void _iceGcVisitMembers(IceInternal::GCVisitor & _v)105Ice::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) const116Ice::UnknownSlicedValue::_iceWrite(Ice::OutputStream* ostr) const 117 { 118 ostr->startValue(_slicedData); 119 ostr->endValue(); 120 } 121 122 void _iceRead(Ice::InputStream * istr)123Ice::UnknownSlicedValue::_iceRead(Ice::InputStream* istr) 124 { 125 istr->startValue(); 126 _slicedData = istr->endValue(true); 127 } 128