Mercurial > foo_out_sdl
comparison foosdk/sdk/libPPUI/CEnumString.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #pragma once | |
| 2 #include <memory> | |
| 3 #include "pp-COM-macros.h" | |
| 4 | |
| 5 namespace PP { | |
| 6 | |
| 7 class CEnumString : public IEnumString { | |
| 8 public: | |
| 9 typedef pfc::chain_list_v2_t<pfc::array_t<TCHAR> > t_data; | |
| 10 | |
| 11 | |
| 12 struct shared_t { | |
| 13 t_data m_data; | |
| 14 pfc::mutex m_sync; | |
| 15 }; | |
| 16 typedef std::shared_ptr<shared_t> shared_ptr_t; | |
| 17 | |
| 18 CEnumString(t_data && in) { | |
| 19 m_shared = std::make_shared<shared_t>(); | |
| 20 m_shared->m_data = std::move(in); | |
| 21 myReset(); | |
| 22 } | |
| 23 CEnumString(const t_data & in) { | |
| 24 m_shared = std::make_shared<shared_t>(); | |
| 25 m_shared->m_data = in; | |
| 26 myReset(); | |
| 27 } | |
| 28 CEnumString() { | |
| 29 m_shared = std::make_shared< shared_t >(); | |
| 30 } | |
| 31 | |
| 32 void SetStrings(t_data && data) { | |
| 33 PFC_INSYNC(m_shared->m_sync); | |
| 34 m_shared->m_data = std::move(data); | |
| 35 myReset(); | |
| 36 } | |
| 37 | |
| 38 static pfc::array_t<TCHAR> stringToBuffer(const char * in) { | |
| 39 pfc::array_t<TCHAR> arr; | |
| 40 arr.set_size(pfc::stringcvt::estimate_utf8_to_wide(in)); | |
| 41 pfc::stringcvt::convert_utf8_to_wide_unchecked(arr.get_ptr(), in); | |
| 42 return arr; | |
| 43 } | |
| 44 | |
| 45 void AddString(const TCHAR * in) { | |
| 46 PFC_INSYNC(m_shared->m_sync); | |
| 47 m_shared->m_data.insert_last()->set_data_fromptr(in, _tcslen(in) + 1); | |
| 48 myReset(); | |
| 49 } | |
| 50 void AddStringU(const char * in, t_size len) { | |
| 51 PFC_INSYNC(m_shared->m_sync); | |
| 52 pfc::array_t<TCHAR> & arr = *m_shared->m_data.insert_last(); | |
| 53 arr.set_size(pfc::stringcvt::estimate_utf8_to_wide(in, len)); | |
| 54 pfc::stringcvt::convert_utf8_to_wide(arr.get_ptr(), arr.get_size(), in, len); | |
| 55 myReset(); | |
| 56 } | |
| 57 void AddStringU(const char * in) { | |
| 58 PFC_INSYNC(m_shared->m_sync); | |
| 59 *m_shared->m_data.insert_last() = stringToBuffer(in); | |
| 60 myReset(); | |
| 61 } | |
| 62 void ResetStrings() { | |
| 63 PFC_INSYNC(m_shared->m_sync); | |
| 64 m_shared->m_data.remove_all(); | |
| 65 myReset(); | |
| 66 } | |
| 67 | |
| 68 typedef ImplementCOMRefCounter<CEnumString> TImpl; | |
| 69 COM_QI_BEGIN() | |
| 70 COM_QI_ENTRY(IUnknown) | |
| 71 COM_QI_ENTRY(IEnumString) | |
| 72 COM_QI_END() | |
| 73 | |
| 74 HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) override { | |
| 75 PFC_INSYNC(m_shared->m_sync); | |
| 76 if (rgelt == NULL) return E_INVALIDARG; | |
| 77 ULONG done = 0; | |
| 78 while (done < celt && m_walk.is_valid()) { | |
| 79 rgelt[done] = CoStrDup(m_walk->get_ptr()); | |
| 80 ++m_walk; ++done; | |
| 81 } | |
| 82 if (pceltFetched != NULL) *pceltFetched = done; | |
| 83 return done == celt ? S_OK : S_FALSE; | |
| 84 } | |
| 85 | |
| 86 HRESULT STDMETHODCALLTYPE Skip(ULONG celt) override { | |
| 87 PFC_INSYNC(m_shared->m_sync); | |
| 88 while (celt > 0) { | |
| 89 if (m_walk.is_empty()) return S_FALSE; | |
| 90 --celt; ++m_walk; | |
| 91 } | |
| 92 return S_OK; | |
| 93 } | |
| 94 | |
| 95 HRESULT STDMETHODCALLTYPE Reset() override { | |
| 96 PFC_INSYNC(m_shared->m_sync); | |
| 97 myReset(); | |
| 98 return S_OK; | |
| 99 } | |
| 100 | |
| 101 HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum) override { | |
| 102 PFC_INSYNC(m_shared->m_sync); | |
| 103 *ppenum = new TImpl(*this); return S_OK; | |
| 104 } | |
| 105 private: | |
| 106 void myReset() { m_walk = m_shared->m_data.first(); } | |
| 107 | |
| 108 static TCHAR * CoStrDup(const TCHAR * in) { | |
| 109 const size_t lenBytes = (_tcslen(in) + 1) * sizeof(TCHAR); | |
| 110 TCHAR * out = reinterpret_cast<TCHAR*>(CoTaskMemAlloc(lenBytes)); | |
| 111 if (out) memcpy(out, in, lenBytes); | |
| 112 return out; | |
| 113 } | |
| 114 | |
| 115 shared_ptr_t m_shared; | |
| 116 t_data::const_iterator m_walk; | |
| 117 }; | |
| 118 } |
