|  | //===-- SBMemoryRegionInfoList.cpp ------------------------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "lldb/API/SBMemoryRegionInfoList.h" | 
|  | #include "SBReproducerPrivate.h" | 
|  | #include "lldb/API/SBMemoryRegionInfo.h" | 
|  | #include "lldb/API/SBStream.h" | 
|  | #include "lldb/Target/MemoryRegionInfo.h" | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | using namespace lldb; | 
|  | using namespace lldb_private; | 
|  |  | 
|  | class MemoryRegionInfoListImpl { | 
|  | public: | 
|  | MemoryRegionInfoListImpl() : m_regions() {} | 
|  |  | 
|  | MemoryRegionInfoListImpl(const MemoryRegionInfoListImpl &rhs) | 
|  | : m_regions(rhs.m_regions) {} | 
|  |  | 
|  | MemoryRegionInfoListImpl &operator=(const MemoryRegionInfoListImpl &rhs) { | 
|  | if (this == &rhs) | 
|  | return *this; | 
|  | m_regions = rhs.m_regions; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | size_t GetSize() const { return m_regions.size(); } | 
|  |  | 
|  | void Reserve(size_t capacity) { return m_regions.reserve(capacity); } | 
|  |  | 
|  | void Append(const MemoryRegionInfo &sb_region) { | 
|  | m_regions.push_back(sb_region); | 
|  | } | 
|  |  | 
|  | void Append(const MemoryRegionInfoListImpl &list) { | 
|  | Reserve(GetSize() + list.GetSize()); | 
|  |  | 
|  | for (const auto &val : list.m_regions) | 
|  | Append(val); | 
|  | } | 
|  |  | 
|  | void Clear() { m_regions.clear(); } | 
|  |  | 
|  | bool GetMemoryRegionInfoAtIndex(size_t index, | 
|  | MemoryRegionInfo ®ion_info) { | 
|  | if (index >= GetSize()) | 
|  | return false; | 
|  | region_info = m_regions[index]; | 
|  | return true; | 
|  | } | 
|  |  | 
|  | MemoryRegionInfos &Ref() { return m_regions; } | 
|  |  | 
|  | const MemoryRegionInfos &Ref() const { return m_regions; } | 
|  |  | 
|  | private: | 
|  | MemoryRegionInfos m_regions; | 
|  | }; | 
|  |  | 
|  | MemoryRegionInfos &SBMemoryRegionInfoList::ref() { return m_opaque_up->Ref(); } | 
|  |  | 
|  | const MemoryRegionInfos &SBMemoryRegionInfoList::ref() const { | 
|  | return m_opaque_up->Ref(); | 
|  | } | 
|  |  | 
|  | SBMemoryRegionInfoList::SBMemoryRegionInfoList() | 
|  | : m_opaque_up(new MemoryRegionInfoListImpl()) { | 
|  | LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBMemoryRegionInfoList); | 
|  | } | 
|  |  | 
|  | SBMemoryRegionInfoList::SBMemoryRegionInfoList( | 
|  | const SBMemoryRegionInfoList &rhs) | 
|  | : m_opaque_up(new MemoryRegionInfoListImpl(*rhs.m_opaque_up)) { | 
|  | LLDB_RECORD_CONSTRUCTOR(SBMemoryRegionInfoList, | 
|  | (const lldb::SBMemoryRegionInfoList &), rhs); | 
|  | } | 
|  |  | 
|  | SBMemoryRegionInfoList::~SBMemoryRegionInfoList() {} | 
|  |  | 
|  | const SBMemoryRegionInfoList &SBMemoryRegionInfoList:: | 
|  | operator=(const SBMemoryRegionInfoList &rhs) { | 
|  | LLDB_RECORD_METHOD( | 
|  | const lldb::SBMemoryRegionInfoList &, | 
|  | SBMemoryRegionInfoList, operator=,(const lldb::SBMemoryRegionInfoList &), | 
|  | rhs); | 
|  |  | 
|  | if (this != &rhs) { | 
|  | *m_opaque_up = *rhs.m_opaque_up; | 
|  | } | 
|  | return LLDB_RECORD_RESULT(*this); | 
|  | } | 
|  |  | 
|  | uint32_t SBMemoryRegionInfoList::GetSize() const { | 
|  | LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBMemoryRegionInfoList, GetSize); | 
|  |  | 
|  | return m_opaque_up->GetSize(); | 
|  | } | 
|  |  | 
|  | bool SBMemoryRegionInfoList::GetMemoryRegionAtIndex( | 
|  | uint32_t idx, SBMemoryRegionInfo ®ion_info) { | 
|  | LLDB_RECORD_METHOD(bool, SBMemoryRegionInfoList, GetMemoryRegionAtIndex, | 
|  | (uint32_t, lldb::SBMemoryRegionInfo &), idx, region_info); | 
|  |  | 
|  | return m_opaque_up->GetMemoryRegionInfoAtIndex(idx, region_info.ref()); | 
|  | } | 
|  |  | 
|  | void SBMemoryRegionInfoList::Clear() { | 
|  | LLDB_RECORD_METHOD_NO_ARGS(void, SBMemoryRegionInfoList, Clear); | 
|  |  | 
|  | m_opaque_up->Clear(); | 
|  | } | 
|  |  | 
|  | void SBMemoryRegionInfoList::Append(SBMemoryRegionInfo &sb_region) { | 
|  | LLDB_RECORD_METHOD(void, SBMemoryRegionInfoList, Append, | 
|  | (lldb::SBMemoryRegionInfo &), sb_region); | 
|  |  | 
|  | m_opaque_up->Append(sb_region.ref()); | 
|  | } | 
|  |  | 
|  | void SBMemoryRegionInfoList::Append(SBMemoryRegionInfoList &sb_region_list) { | 
|  | LLDB_RECORD_METHOD(void, SBMemoryRegionInfoList, Append, | 
|  | (lldb::SBMemoryRegionInfoList &), sb_region_list); | 
|  |  | 
|  | m_opaque_up->Append(*sb_region_list); | 
|  | } | 
|  |  | 
|  | const MemoryRegionInfoListImpl *SBMemoryRegionInfoList::operator->() const { | 
|  | return m_opaque_up.get(); | 
|  | } | 
|  |  | 
|  | const MemoryRegionInfoListImpl &SBMemoryRegionInfoList::operator*() const { | 
|  | assert(m_opaque_up.get()); | 
|  | return *m_opaque_up; | 
|  | } | 
|  |  | 
|  | namespace lldb_private { | 
|  | namespace repro { | 
|  |  | 
|  | template <> | 
|  | void RegisterMethods<SBMemoryRegionInfoList>(Registry &R) { | 
|  | LLDB_REGISTER_CONSTRUCTOR(SBMemoryRegionInfoList, ()); | 
|  | LLDB_REGISTER_CONSTRUCTOR(SBMemoryRegionInfoList, | 
|  | (const lldb::SBMemoryRegionInfoList &)); | 
|  | LLDB_REGISTER_METHOD( | 
|  | const lldb::SBMemoryRegionInfoList &, | 
|  | SBMemoryRegionInfoList, operator=,( | 
|  | const lldb::SBMemoryRegionInfoList &)); | 
|  | LLDB_REGISTER_METHOD_CONST(uint32_t, SBMemoryRegionInfoList, GetSize, ()); | 
|  | LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfoList, GetMemoryRegionAtIndex, | 
|  | (uint32_t, lldb::SBMemoryRegionInfo &)); | 
|  | LLDB_REGISTER_METHOD(void, SBMemoryRegionInfoList, Clear, ()); | 
|  | LLDB_REGISTER_METHOD(void, SBMemoryRegionInfoList, Append, | 
|  | (lldb::SBMemoryRegionInfo &)); | 
|  | LLDB_REGISTER_METHOD(void, SBMemoryRegionInfoList, Append, | 
|  | (lldb::SBMemoryRegionInfoList &)); | 
|  | } | 
|  |  | 
|  | } | 
|  | } |