xmemory std::allocator源代码及注释

本文深入解析C++标准库文件xmemory,介绍内存分配函数如_Allocate和_Construct,以及销毁函数_Destroy。文章涵盖模板函数的实现细节,包括分配器allocator的使用和特化,展示了如何在C++中有效地管理内存和对象生命周期。

 

//D:/Program Files/Microsoft Visual Studio 8/VC/include/xmemory

// xmemory internal header (from )
#pragma once
#ifndef _XMEMORY_
#define _XMEMORY_
#ifndef RC_INVOKED
#include
#include
#include
#include

#ifdef _MSC_VER
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)

#pragma warning(disable: 4100)
#endif /* _MSC_VER */

#ifndef _FARQ /* specify standard memory model */
#define _FARQ
#define _PDFT ptrdiff_t
#define _SIZT size_t
#endif /* _FARQ */

#define _CPOINTER_X(T, A) /
typename A::template rebind::other::const_pointer
#define _CREFERENCE_X(T, A) /
typename A::template rebind::other::const_reference
#define _POINTER_X(T, A) /
typename A::template rebind::other::pointer
#define _REFERENCE_X(T, A) /
typename A::template rebind::other::reference

_STD_BEGIN
// TEMPLATE FUNCTION _Allocate
template inline
_Ty _FARQ *_Allocate(_SIZT _Count, _Ty _FARQ *)
{ // check for integer overflow
if (_Count <= 0)
_Count = 0;
else if (((_SIZT)(-1) / _Count) < sizeof (_Ty))
_THROW_NCEE(std::bad_alloc, NULL);

// allocate storage for _Count elements of type _Ty
return ((_Ty _FARQ *)::operator new(_Count * sizeof (_Ty)));
}

// TEMPLATE FUNCTION _Construct
templateclass _T2> inline
void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
{ // construct object at _Ptr with value _Val
void _FARQ *_Vptr = _Ptr;
::new (_Vptr) _T1(_Val);// [::] new [placement] new-type-name [new-initializer]
}

// TEMPLATE FUNCTION _Destroy
template inline
void _Destroy(_Ty _FARQ *_Ptr)
{ // destroy object at _Ptr
_DESTRUCTOR(_Ty, _Ptr);
}

//特化??

template<> inline
void _Destroy(char _FARQ *)
{ // destroy a char (do nothing)
}

template<> inline
void _Destroy(wchar_t _FARQ *)
{ // destroy a wchar_t (do nothing)
}

// TEMPLATE CLASS _Allocator_base
template
struct _Allocator_base
{ // base class for generic allocators
typedef _Ty value_type;
};

// TEMPLATE CLASS _Allocator_base
template
struct _Allocator_base
{ // base class for generic allocators for const _Ty
typedef _Ty value_type;
};

// TEMPLATE CLASS allocator
template
class allocator
: public _Allocator_base<_Ty>
{ // generic allocator for objects of class _Ty
public:
typedef _Allocator_base<_Ty> _Mybase;
typedef typename _Mybase::value_type value_type;
typedef value_type _FARQ *pointer;
typedef value_type _FARQ& reference;
typedef const value_type _FARQ *const_pointer;
typedef const value_type _FARQ& const_reference;

typedef _SIZT size_type;
typedef _PDFT difference_type;

template
struct rebind
{ // convert an allocator<_Ty> to an allocator <_Other>
typedef allocator<_Other> other;
};

pointer address(reference _Val) const
{ // return address of mutable _Val
return (&_Val);
}

const_pointer address(const_reference _Val) const
{ // return address of nonmutable _Val
return (&_Val);
}

allocator() _THROW0()
{ // construct default allocator (do nothing)
}

allocator(const allocator<_Ty>&) _THROW0()
{ // construct by copying (do nothing)
}

template
allocator(const allocator<_Other>&) _THROW0()
{ // construct from a related allocator (do nothing)
}

template
allocator<_Ty>& operator=(const allocator<_Other>&)
{ // assign from a related allocator (do nothing)
return (*this);
}

void deallocate(pointer _Ptr, size_type)
{ // deallocate object at _Ptr, ignore size
::operator delete(_Ptr);
}

pointer allocate(size_type _Count)
{ // allocate array of _Count elements
return (_Allocate(_Count, (pointer)0));
}

pointer allocate(size_type _Count, const void _FARQ *)
{ // allocate array of _Count elements, ignore hint
return (allocate(_Count));
}

void construct(pointer _Ptr, const _Ty& _Val)
{ // construct object at _Ptr with value _Val
_Construct(_Ptr, _Val);
}

void destroy(pointer _Ptr)
{ // destroy object at _Ptr
_Destroy(_Ptr);
}

_SIZT max_size() const _THROW0()
{ // estimate maximum array size
_SIZT _Count = (_SIZT)(-1) / sizeof (_Ty);
return (0 < _Count ? _Count : 1);
}
};

// allocator TEMPLATE OPERATORS
templateclass _Other> inline
bool operator==(const allocator<_Ty>&, const allocator<_Other>&) _THROW0()
{ // test for allocator equality (always true)
return (true);
}

templateclass _Other> inline
bool operator!=(const allocator<_Ty>&, const allocator<_Other>&) _THROW0()
{ // test for allocator inequality (always false)
return (false);
}

// CLASS allocator
template<> class _CRTIMP2_PURE allocator
{ // generic allocator for type void
public:
typedef void _Ty;
typedef _Ty _FARQ *pointer;
typedef const _Ty _FARQ *const_pointer;
typedef _Ty value_type;

template
struct rebind
{ // convert an allocator to an allocator <_Other>
typedef allocator<_Other> other;
};

allocator() _THROW0()
{ // construct default allocator (do nothing)
}

allocator(const allocator<_Ty>&) _THROW0()
{ // construct by copying (do nothing)
}

template
allocator(const allocator<_Other>&) _THROW0()
{ // construct from related allocator (do nothing)
}

template
allocator<_Ty>& operator=(const allocator<_Other>&)
{ // assign from a related allocator (do nothing)
return (*this);
}
};

// TEMPLATE FUNCTION _Destroy_range
templateclass _Alloc> inline
void _Destroy_range(_Ty *_First, _Ty *_Last, _Alloc& _Al)
{ // destroy [_First, _Last)
_Destroy_range(_First, _Last, _Al, _Ptr_cat(_First, _Last));
}

templateclass _Alloc> inline
void _Destroy_range(_Ty *_First, _Ty *_Last, _Alloc& _Al,
_Nonscalar_ptr_iterator_tag)
{ // destroy [_First, _Last), arbitrary type
for (; _First != _Last; ++_First)
_Al.destroy(_First);
}

templateclass _Alloc> inline
void _Destroy_range(_Ty *_First, _Ty *_Last, _Alloc& _Al,
_Scalar_ptr_iterator_tag)
{ // destroy [_First, _Last), scalar type (do nothing)
}
_STD_END

#ifdef _MSC_VER
#pragma warning(default: 4100)

#pragma warning(pop)
#pragma pack(pop)
#endif /* _MSC_VER */

#endif /* RC_INVOKED */
#endif /* _XMEMORY_ */

/*
* Copyright (c) 1992-2005 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
*/

/*
* This file is derived from software bearing the following
* restrictions:
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this
* software and its documentation for any purpose is hereby
* granted without fee, provided that the above copyright notice
* appear in all copies and that both that copyright notice and
* this permission notice appear in supporting documentation.
* Hewlett-Packard Company makes no representations about the
* suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
V4.05:0009 */

请仔细阅读和分析下面函数,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码 要求如下: 1.保持所有原始功能不变 2.提高执行效率,降低计算复杂度 3.已经给定的结构体名字和元素不要更改,详细的中文注释 4.自动添加中文注释说明功能逻辑 5.不使用 auto,使用显式 for 循环 6.结构体采用32位定义 7.不要使用小函数,保持原始的函数定义 8.严格保持protobuf字段映射关系 特别注意: 1.函数中有关位操作不变,函数间的位操作一致, 详细注释位操作 2.函数中的 HDDMXng::BelUsageDef::BelUsageDef 映射为 message BelUsageDef { optional uint32 numhiddencfgs = 1; optional uint32 numcfgs = 2; optional uint32 numattribs = 3; } 3.采用 google::protobuf::Descriptor 和 google::protobuf::Reflection 进行编程 4.不要使用如 HIBYTE 等宏定义 5.将函数中的 _BYTE usagedef_msg[16] 映射为 HDDMXng::BelUsageDef usagedef_msg 6.将函数中的 hddmBelUsageAttribVec、hddmBelUsageAttribVec_End、 hddmBelUsageAttribVec_Cap 映射为 std::vector<HDDMBelUsageAttrib *> hddmBelUsageAttribVec void HDDMBelUsageDef::HDDMBelUsageDef(HDDMBelUsageDef *this) { int v1; // eax this->usagedef_code = 0; v1 = *(_DWORD *)&this->usagedef_code; this->hddmBelUsageAttribVec = 0; this->hddmBelUsageAttribVec_Cap = 0; this->ppHddmBelUsageAttrib = 0; *(_DWORD *)&this->char28 = 0; this->qword30 = 0; this->qword48 = 0; *(_DWORD *)&this->usagedef_code = v1 & 0xFFF000FF; this->? = 0; this->qword50 = 0; this->qword38 = &this->char28; this->qword40 = &this->char28; } void HDDMBelUsageDef::addattrib(HDDMBelUsageDef *this) { HDDMBelUsageAttrib *v1; // rbp HDDMBelUsageAttrib **hddmBelUsageAttribVec_Cap; // rax bool v3; // zf __int64 hddmBelUsageAttribVec_Cap_1; // rdx __int64 v5[5]; // [rsp+0h] [rbp-28h] BYREF v1 = (HDDMBelUsageAttrib *)operator new(0x50u); HDDMBelUsageAttrib::HDDMBelUsageAttrib(v1); hddmBelUsageAttribVec_Cap = (HDDMBelUsageAttrib **)this->hddmBelUsageAttribVec_Cap; v3 = hddmBelUsageAttribVec_Cap == this->ppHddmBelUsageAttrib; v5[0] = (__int64)v1; if ( v3 ) { std::vector<HDDMBelUsageAttrib *>::_M_emplace_back_aux<HDDMBelUsageAttrib * const&>( &this->hddmBelUsageAttribVec, v5); } else { if ( hddmBelUsageAttribVec_Cap ) { *hddmBelUsageAttribVec_Cap = v1; hddmBelUsageAttribVec_Cap_1 = this->hddmBelUsageAttribVec_Cap; } else { hddmBelUsageAttribVec_Cap_1 = 0; } this->hddmBelUsageAttribVec_Cap = hddmBelUsageAttribVec_Cap_1 + 8; } } HDDMBelUsageAttrib * HDDMBelUsageDef::getAttrib(HDDMBelUsageDef *this, const std::string *stdString) { __int64 p_char28; // rax HDDMBelUsageAttrib *result; // rax __int64 v4; // rdi int v5; // edx HDDMBelUsageAttrib *v6; // [rsp+8h] [rbp-40h] char v7; // [rsp+1Fh] [rbp-29h] BYREF _QWORD v8[5]; // [rsp+20h] [rbp-28h] BYREF std::string::string(v8, *(_QWORD *)stdString, &v7); p_char28 = std::_Rb_tree<std::string,std::pair<std::string const,unsigned short>,std::_Select1st<std::pair<std::string const,unsigned short>>,std::less<std::string>,std::allocator<std::pair<std::string const,unsigned short>>>::find( &this->gap20, v8); if ( (_QWORD *)p_char28 == &this->char28 ) result = 0; else result = *(HDDMBelUsageAttrib **)(*(_QWORD *)&this->hddmBelUsageAttribVec + 8LL * *(unsigned __int16 *)(p_char28 + 40)); v4 = v8[0] - 24LL; if ( (_UNKNOWN *)(v8[0] - 24LL) != &std::string::_Rep::_S_empty_rep_storage ) { if ( &_pthread_key_create ) { v5 = _InterlockedExchangeAdd((volatile signed __int32 *)(v8[0] - 8LL), 0xFFFFFFFF); } else { v5 = *(_DWORD *)(v8[0] - 8LL); *(_DWORD *)(v8[0] - 8LL) = v5 - 1; } if ( v5 <= 0 ) { v6 = result; std::string::_Rep::_M_destroy(v4, &v7); return v6; } } return result; } 将 _QWORD *pHddmBelUsageAttribVec 映射为 映射为 std::vector<HDDMBelUsageAttrib *> pHddmBelUsageAttribVec HDDMBelUsageAttrib * HDDMBelUsageDef::getAttribs(HDDMBelUsageDef *this, _QWORD *pHddmBelUsageAttribVec) { HDDMBelUsageAttrib *hddmBelUsageAttribVec_Cap_2; // rsi HDDMBelUsageAttrib *hddmBelUsageAttribVec_Cap; // rdi unsigned __int64 v6; // rdx unsigned __int64 v7; // rax HDDMBelUsageAttrib *hddmBelUsageAttribVec_Cap_1; // rax __int64 v9; // r8 char *v10; // rdx hddmBelUsageAttribVec_Cap_2 = *(HDDMBelUsageAttrib **)&this->hddmBelUsageAttribVec; hddmBelUsageAttribVec_Cap = (HDDMBelUsageAttrib *)this->hddmBelUsageAttribVec_Cap; v6 = ((char *)hddmBelUsageAttribVec_Cap - (char *)hddmBelUsageAttribVec_Cap_2) >> 3; v7 = (__int64)(pHddmBelUsageAttribVec[1] - *pHddmBelUsageAttribVec) >> 3; if ( v6 > v7 ) { std::vector<HDDMBelUsageAttrib *>::_M_default_append(pHddmBelUsageAttribVec, v6 - v7); hddmBelUsageAttribVec_Cap = (HDDMBelUsageAttrib *)this->hddmBelUsageAttribVec_Cap; hddmBelUsageAttribVec_Cap_2 = *(HDDMBelUsageAttrib **)&this->hddmBelUsageAttribVec; } else if ( v6 < v7 ) { pHddmBelUsageAttribVec[1] = *pHddmBelUsageAttribVec + 8 * v6; hddmBelUsageAttribVec_Cap = (HDDMBelUsageAttrib *)this->hddmBelUsageAttribVec_Cap; hddmBelUsageAttribVec_Cap_2 = *(HDDMBelUsageAttrib **)&this->hddmBelUsageAttribVec; } hddmBelUsageAttribVec_Cap_1 = hddmBelUsageAttribVec_Cap_2; if ( hddmBelUsageAttribVec_Cap_2 != hddmBelUsageAttribVec_Cap ) { do { v9 = *(_QWORD *)&hddmBelUsageAttribVec_Cap_1->attrib_flags; v10 = (char *)((char *)hddmBelUsageAttribVec_Cap_1 - (char *)hddmBelUsageAttribVec_Cap_2); hddmBelUsageAttribVec_Cap_1 = (HDDMBelUsageAttrib *)((char *)hddmBelUsageAttribVec_Cap_1 + 8); *(_QWORD *)&v10[*pHddmBelUsageAttribVec] = v9; } while ( (HDDMBelUsageAttrib *)this->hddmBelUsageAttribVec_Cap != hddmBelUsageAttribVec_Cap_1 ); } return hddmBelUsageAttribVec_Cap_1; } void HDDMBelUsageDef::print(HDDMBelUsageDef *this, std::ostream *stream, const std::string *filename) { std::ostream *v5; // rbp __int64 v6; // rax _BYTE *v7; // r12 char v8; // al std::ostream *v9; // rax HDDMBelUsageAttrib **hddmBelUsageAttribVec_Cap_1; // rbp HDDMBelUsageAttrib *v11; // rdi HDDMBelUsageAttrib **hddmBelUsageAttribVec_Cap; // r12 __int64 v13; // rax _BYTE *v14; // r12 char v15; // al std::ostream *v16; // rax __int64 v17; // rax _BYTE *v18; // rbp char v19; // al std::ostream *v20; // rax if ( (__int64)(this->hddmBelUsageAttribVec_Cap - *(_QWORD *)&this->hddmBelUsageAttribVec) >> 3 ) { v5 = (std::ostream *)std::__ostream_insert<char,std::char_traits<char>>( stream, *(_QWORD *)filename, *(_QWORD *)(*(_QWORD *)filename - 24LL)); std::__ostream_insert<char,std::char_traits<char>>(v5, "ATTRIBUTES:", 11); v6 = *(_QWORD *)(*(_QWORD *)v5 - 24LL); v7 = *(_BYTE **)((char *)v5 + v6 + 240); if ( !v7 ) LABEL_21: std::__throw_bad_cast(); if ( v7[56] ) { v8 = v7[67]; } else { std::ctype<char>::_M_widen_init(*(_QWORD *)((char *)v5 + v6 + 240)); v8 = (*(__int64 (__fastcall **)(_BYTE *, __int64))(*(_QWORD *)v7 + 48LL))(v7, 10); } v9 = (std::ostream *)std::ostream::put(v5, v8); std::ostream::flush(v9); hddmBelUsageAttribVec_Cap_1 = *(HDDMBelUsageAttrib ***)&this->hddmBelUsageAttribVec; while ( (HDDMBelUsageAttrib **)this->hddmBelUsageAttribVec_Cap != hddmBelUsageAttribVec_Cap_1 ) { while ( 1 ) { v11 = *hddmBelUsageAttribVec_Cap_1++; HDDMBelUsageAttrib::print(v11, stream, filename); hddmBelUsageAttribVec_Cap = (HDDMBelUsageAttrib **)this->hddmBelUsageAttribVec_Cap; if ( hddmBelUsageAttribVec_Cap == hddmBelUsageAttribVec_Cap_1 ) break; std::__ostream_insert<char,std::char_traits<char>>(stream, ",", 1); v13 = *(_QWORD *)(*(_QWORD *)stream - 24LL); v14 = *(_BYTE **)((char *)stream + v13 + 240); if ( !v14 ) goto LABEL_21; if ( v14[56] ) { v15 = v14[67]; } else { std::ctype<char>::_M_widen_init(*(_QWORD *)((char *)stream + v13 + 240)); v15 = (*(__int64 (__fastcall **)(_BYTE *, __int64))(*(_QWORD *)v14 + 48LL))(v14, 10); } v16 = (std::ostream *)std::ostream::put(stream, v15); std::ostream::flush(v16); if ( (HDDMBelUsageAttrib **)this->hddmBelUsageAttribVec_Cap == hddmBelUsageAttribVec_Cap_1 ) return; } std::__ostream_insert<char,std::char_traits<char>>(stream, ";", 1); v17 = *(_QWORD *)(*(_QWORD *)stream - 24LL); v18 = *(_BYTE **)((char *)stream + v17 + 240); if ( !v18 ) goto LABEL_21; if ( v18[56] ) { v19 = v18[67]; } else { std::ctype<char>::_M_widen_init(*(_QWORD *)((char *)stream + v17 + 240)); v19 = (*(__int64 (__fastcall **)(_BYTE *, __int64))(*(_QWORD *)v18 + 48LL))(v18, 10); } hddmBelUsageAttribVec_Cap_1 = hddmBelUsageAttribVec_Cap; v20 = (std::ostream *)std::ostream::put(stream, v19); std::ostream::flush(v20); } } } void __fastcall HDDMBelUsageDef::readme_pb(HDDMBelUsageDef *this, std::istream *stream, HDDMDevice *hddmDevice) { google::protobuf::Message *v4; // rdx unsigned int byte0; // eax __int16 v6; // dx int v7; // ebx HDDMBelUsageAttrib *v8; // rbx HDDMBelUsageAttrib **hddmBelUsageAttribVec_Cap; // rax bool v10; // zf __int64 qword10_1; // rax HDDMBelUsageAttrib *v12; // rdi _QWORD *qword30; // r15 std::string *s2; // rbx _QWORD *p_char28_1; // rbp size_t n_3; // r14 int n0x7FFFFFFF_1; // eax _QWORD *s1; // rdi size_t n_2; // r13 size_t n; // rdx __int64 n0x7FFFFFFF; // r13 _QWORD *s2_1; // rsi size_t n_4; // r15 size_t n_1; // rdx int v25; // eax __int64 p_char28_2; // rax __int16 v27; // cx _QWORD *p_char28; // [rsp+0h] [rbp-E8h] HDDMBelUsageAttrib *v29; // [rsp+8h] [rbp-E0h] int index; // [rsp+18h] [rbp-D0h] int v32; // [rsp+1Ch] [rbp-CCh] _QWORD *p_qword8; // [rsp+38h] [rbp-B0h] char v35; // [rsp+5Fh] [rbp-89h] BYREF HDDMBelUsageAttrib *pHddmBelUsageAttrib; // [rsp+60h] [rbp-88h] BYREF std::string **p_attrib_name; // [rsp+70h] [rbp-78h] BYREF _BYTE usagedef_msg[16]; // [rsp+80h] [rbp-68h] BYREF __int16 v39; // [rsp+90h] [rbp-58h] __int16 v40; // [rsp+94h] [rbp-54h] int v41; // [rsp+98h] [rbp-50h] if ( HDDMDeviceDump::useXngMarks ) std::istream::read(stream, HDDMDeviceDump::markBuffer, 11); HDDMXng::BelUsageDef::BelUsageDef((HDDMXng::BelUsageDef *)usagedef_msg); HDDMDevice::readMessage((HDDMDevice *)stream, (std::istream *)usagedef_msg, v4); p_qword8 = &this->hddmBelUsageAttribVec; byte0 = ((v39 & 0xFFF) << 8) | this->usagedef_code & 0xFFF000FF; v6 = v40; this->usagedef_code = byte0; HIWORD(this->usagedef_code) = (16 * v6) | BYTE2(byte0) & 0xF; v7 = v41; v32 = v41; std::vector<HDDMBelUsageAttrib *>::reserve(&this->hddmBelUsageAttribVec, v41); if ( v7 <= 0 ) goto LABEL_30; index = 0; p_char28 = &this->char28; do { v8 = (HDDMBelUsageAttrib *)operator new(0x50u); HDDMBelUsageAttrib::HDDMBelUsageAttrib(v8); hddmBelUsageAttribVec_Cap = (HDDMBelUsageAttrib **)this->hddmBelUsageAttribVec_Cap; v10 = hddmBelUsageAttribVec_Cap == this->ppHddmBelUsageAttrib; pHddmBelUsageAttrib = v8; if ( v10 ) { std::vector<HDDMBelUsageAttrib *>::_M_emplace_back_aux<HDDMBelUsageAttrib * const&>( p_qword8, &pHddmBelUsageAttrib); v12 = pHddmBelUsageAttrib; } else { if ( hddmBelUsageAttribVec_Cap ) { *hddmBelUsageAttribVec_Cap = v8; qword10_1 = this->hddmBelUsageAttribVec_Cap; v12 = pHddmBelUsageAttrib; } else { v12 = v8; qword10_1 = 0; } this->hddmBelUsageAttribVec_Cap = qword10_1 + 8; } HDDMBelUsageAttrib::readme_pb(v12, stream, hddmDevice); pHddmBelUsageAttrib->attrib_flags = ((index & 0xFFF) << 12) | pHddmBelUsageAttrib->attrib_flags & 0xFF000FFF; qword30 = (_QWORD *)this->qword30; v29 = pHddmBelUsageAttrib; if ( !qword30 ) { p_char28_1 = p_char28; goto LABEL_32; } s2 = pHddmBelUsageAttrib->attrib_name; p_char28_1 = p_char28; n_3 = *((_QWORD *)s2 - 3); do { while ( 1 ) { s1 = (_QWORD *)qword30[4]; n_2 = *(s1 - 3); n = n_2; if ( n_3 <= n_2 ) n = n_3; n0x7FFFFFFF_1 = memcmp(s1, s2, n); if ( !n0x7FFFFFFF_1 ) break; LABEL_12: if ( n0x7FFFFFFF_1 < 0 ) goto LABEL_19; LABEL_13: p_char28_1 = qword30; qword30 = (_QWORD *)qword30[2]; if ( !qword30 ) goto LABEL_20; } n0x7FFFFFFF = n_2 - n_3; if ( n0x7FFFFFFF > 0x7FFFFFFF ) goto LABEL_13; if ( n0x7FFFFFFF >= (__int64)0xFFFFFFFF80000000LL ) { n0x7FFFFFFF_1 = n0x7FFFFFFF; goto LABEL_12; } LABEL_19: qword30 = (_QWORD *)qword30[3]; } while ( qword30 ); LABEL_20: if ( p_char28 == p_char28_1 ) goto LABEL_32; s2_1 = (_QWORD *)p_char28_1[4]; n_4 = *(s2_1 - 3); n_1 = n_4; if ( n_3 <= n_4 ) n_1 = n_3; v25 = memcmp(s2, s2_1, n_1); if ( v25 ) { LABEL_27: if ( v25 < 0 ) goto LABEL_32; LABEL_28: p_char28_2 = (__int64)p_char28_1; goto LABEL_29; } if ( (__int64)(n_3 - n_4) > 0x7FFFFFFF ) goto LABEL_28; if ( (__int64)(n_3 - n_4) >= (__int64)0xFFFFFFFF80000000LL ) { v25 = n_3 - n_4; goto LABEL_27; } LABEL_32: p_attrib_name = &v29->attrib_name; p_char28_2 = std::_Rb_tree<std::string,std::pair<std::string const,unsigned short>,std::_Select1st<std::pair<std::string const,unsigned short>>,std::less<std::string>,std::allocator<std::pair<std::string const,unsigned short>>>::_M_emplace_hint_unique<std::piecewise_construct_t const&,std::tuple<std::string const&>,std::tuple<>>( &this->gap20, p_char28_1, &unk_7B5CA99, &p_attrib_name, &v35); LABEL_29: v27 = index++; *(_WORD *)(p_char28_2 + 40) = v27; } while ( v32 != index ); LABEL_30: HDDMXng::BelUsageDef::~BelUsageDef((HDDMXng::BelUsageDef *)usagedef_msg); } __int64 __fastcall HDDMBelUsageDef::setrecursivebelid(HDDMBelUsageDef *this, unsigned __int16 nId) { int v2; // esi HDDMBelUsageAttrib *hddmBelUsageAttribVec_Cap; // rdx int i; // esi HDDMBelUsageAttrib *HDDMBelUsageAttrib; // rcx __int64 result; // rax LOWORD(v2) = nId & 0xFFF; hddmBelUsageAttribVec_Cap = *(HDDMBelUsageAttrib **)&this->hddmBelUsageAttribVec; for ( i = 16 * v2; hddmBelUsageAttribVec_Cap != (HDDMBelUsageAttrib *)this->hddmBelUsageAttribVec_Cap; HIWORD(HDDMBelUsageAttrib->attrib_type) = i | HIWORD(HDDMBelUsageAttrib->attrib_type) & 0xF ) { HDDMBelUsageAttrib = *(HDDMBelUsageAttrib **)&hddmBelUsageAttribVec_Cap->attrib_flags; hddmBelUsageAttribVec_Cap = (HDDMBelUsageAttrib *)((char *)hddmBelUsageAttribVec_Cap + 8); result = i | HIWORD(HDDMBelUsageAttrib->attrib_type) & 0xFu; } return result; } __int64 __fastcall HDDMBelUsageDef::setrecursivedeviceid(HDDMBelUsageDef *this, unsigned __int16 nId) { __int64 *hddmBelUsageAttribVec_Cap; // rdx int i; // esi HDDMBelUsageAttrib *HDDMBelUsageAttrib; // rcx __int64 result; // rax hddmBelUsageAttribVec_Cap = *(__int64 **)&this->hddmBelUsageAttribVec; for ( i = nId & 0xF; hddmBelUsageAttribVec_Cap != (__int64 *)this->hddmBelUsageAttribVec_Cap; BYTE2(HDDMBelUsageAttrib->attrib_type) = i | BYTE2(HDDMBelUsageAttrib->attrib_type) & 0xF0 ) { HDDMBelUsageAttrib = (HDDMBelUsageAttrib *)*hddmBelUsageAttribVec_Cap++; result = i | BYTE2(HDDMBelUsageAttrib->attrib_type) & 0xF0u; } return result; } void __fastcall HDDMBelUsageDef::writeme_pb(HDDMBelUsageDef *this, std::ostream *stream) { int v2; // eax HDDMBelUsageAttrib **ppHDDMBelUsageAttrib; // rdx unsigned __int64 v4; // rax unsigned __int64 v5; // rbx _BYTE usagedef_msg[8]; // [rsp+0h] [rbp-58h] BYREF int v7; // [rsp+10h] [rbp-48h] int v8; // [rsp+14h] [rbp-44h] int v9; // [rsp+18h] [rbp-40h] unsigned int v10; // [rsp+20h] [rbp-38h] if ( HDDMDeviceDump::useXngMarks ) std::ostream::write(stream, "BELUSAGEDEF", 11); HDDMXng::BelUsageDef::BelUsageDef((HDDMXng::BelUsageDef *)usagedef_msg); v2 = (this->usagedef_code >> 8) & 0xFFF; v10 |= 7u; v7 = v2; v8 = HIWORD(this->usagedef_code) >> 4; v9 = (__int64)(this->hddmBelUsageAttribVec_Cap - *(_QWORD *)&this->hddmBelUsageAttribVec) >> 3; HDDMDevice::writeMessage((HDDMDevice *)stream, (std::ostream *)usagedef_msg, (const google::protobuf::Message *)v10); ppHDDMBelUsageAttrib = *(HDDMBelUsageAttrib ***)&this->hddmBelUsageAttribVec; v4 = 0; v5 = 1; if ( (__int64)(this->hddmBelUsageAttribVec_Cap - (_QWORD)ppHDDMBelUsageAttrib) >> 3 ) { while ( 1 ) { HDDMBelUsageAttrib::writeme_pb(ppHDDMBelUsageAttrib[v4], stream); ppHDDMBelUsageAttrib = *(HDDMBelUsageAttrib ***)&this->hddmBelUsageAttribVec; if ( v5 >= (__int64)(this->hddmBelUsageAttribVec_Cap - (_QWORD)ppHDDMBelUsageAttrib) >> 3 ) break; v4 = v5++; } } HDDMXng::BelUsageDef::~BelUsageDef((HDDMXng::BelUsageDef *)usagedef_msg); } void HDDMBelUsageDef::~HDDMBelUsageDef(HDDMBelUsageDef *this) { HDDMBelUsageAttrib **i_1; // rbx HDDMBelUsageAttrib **i; // rax HDDMBelUsageAttrib *v3; // rbp void *v4; // rdi i_1 = *(HDDMBelUsageAttrib ***)&this->hddmBelUsageAttribVec; for ( i = (HDDMBelUsageAttrib **)this->hddmBelUsageAttribVec_Cap; i_1 != i; ++i_1 ) { v3 = *i_1; if ( *i_1 ) { HDDMBelUsageAttrib::~HDDMBelUsageAttrib(*i_1); operator delete(v3); i = (HDDMBelUsageAttrib **)this->hddmBelUsageAttribVec_Cap; } } this->qword50 = 0; sub_21742B0(this); std::_Rb_tree<std::string,std::pair<std::string const,unsigned short>,std::_Select1st<std::pair<std::string const,unsigned short>>,std::less<std::string>,std::allocator<std::pair<std::string const,unsigned short>>>::_M_erase( &this->gap20, this->qword30); v4 = *(void **)&this->hddmBelUsageAttribVec; if ( v4 ) operator delete(v4); }
最新发布
10-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值