annotate foosdk/sdk/foobar2000/SDK/commonObjects.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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <initializer_list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <pfc/list.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "completion_notify.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 typedef service_ptr objRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 template<typename interface_t> class array_typed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 template<typename interface_t> class array_soft_typed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class NOVTABLE array : public service_base, public pfc::list_base_const_t<service_ptr> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 FB2K_MAKE_SERVICE_INTERFACE( array, service_base );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 virtual size_t count() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 size_t size() const {return count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 virtual objRef itemAt( size_t index ) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 objRef firstItem( ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 objRef lastItem( ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 objRef operator[] (size_t idx) const {return itemAt(idx);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 array::ptr arrayReordered( size_t const * order, size_t count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 array::ptr copy() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //! If this is a mutable array, creates a const copy of it. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! Otherwise returns this object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 array::ptr makeConst() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 static array::ptr empty();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 static array::ptr arrayWithArray( array::ptr source );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 static array::ptr arrayWithObject( objRef source );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 static array::ptr arrayWithObjects( objRef const * source, size_t count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 static array::ptr arrayWithObjects(std::initializer_list< objRef > const&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 size_t indexOfItem( objRef item );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 array::ptr subset( pfc::bit_array const & mask ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 array::ptr subsetExcluding( pfc::bit_array const & mask ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 array::ptr subsetExcludingSingle( size_t index ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 // UNSAFE CAST HELPER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 // Use only when documented as allowed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 template<typename interface_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 const pfc::list_base_const_t< service_ptr_t< interface_t > >& as_list_of() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 const pfc::list_base_const_t<service_ptr> * temp = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 return *reinterpret_cast<const pfc::list_base_const_t< service_ptr_t< interface_t > > * > (temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 // TYPED ARRAY HELPER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 // Usage: for( auto obj : myArray->typed<interface>() ) { ... }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 // Expects ALL objects in the array to implement the interface - causes runtime bugcheck if they don't
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 template<typename interface_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 const array_typed<interface_t>& typed() const { return *reinterpret_cast< const array_typed<interface_t> * > (this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 // SOFT TYPED ARRAY HELPER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 // Usage: for( auto obj : myArray->softTyped<interface>() ) { ... }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 // Skips objects not implementing the interface.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 template<typename interface_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 const array_soft_typed<interface_t>& softTyped() const { return *reinterpret_cast<const array_soft_typed<interface_t> *> (this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 // pfc::list_base_const_t<>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 t_size get_count() const override {return this->count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 void get_item_ex(service_ptr& p_out, t_size n) const override { p_out = this->itemAt(n); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 template<typename interface_t> class array_typed : public array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 typedef service_ptr_t<interface_t> ptr_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 class iterator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 static iterator _make(const array* arr, size_t index) { iterator ret; ret.m_arr = arr; ret.m_index = index; return ret; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 void operator++() { ++m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 bool operator==(const iterator& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index == other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 bool operator!=(const iterator& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index != other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 ptr_t operator*() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 ptr_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 ret ^= m_arr->itemAt(m_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 const array* m_arr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 size_t m_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 typedef iterator const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 iterator begin() const { return iterator::_make(this, 0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 iterator end() const { return iterator::_make(this, this->count()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 template<typename interface_t> class array_soft_typed : public array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 typedef service_ptr_t<interface_t> ptr_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 class iterator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 static iterator _make(const array* arr, size_t index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 iterator ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 ret.m_arr = arr; ret.m_index = index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 ret.m_max = arr->count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 ret.fetch();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 void operator++() { ++m_index; fetch(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 bool operator==(const iterator& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index == other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 bool operator!=(const iterator& other) const { PFC_ASSERT(m_arr == other.m_arr); return m_index != other.m_index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 ptr_t operator*() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 PFC_ASSERT(m_ptr.is_valid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 return m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 void fetch() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 m_ptr.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 while (m_index < m_max) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 if (m_ptr &= m_arr->itemAt(m_index)) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 ++m_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 const array* m_arr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 size_t m_index, m_max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 ptr_t m_ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 typedef iterator const_iterator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 iterator begin() const { return iterator::_make(this, 0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 iterator end() const { return iterator::_make(this, this->count()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 class NOVTABLE arrayMutable : public array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 FB2K_MAKE_SERVICE_INTERFACE( arrayMutable, array );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 virtual void remove( pfc::bit_array const & mask ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 virtual void insert( objRef obj, size_t at ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 virtual void insertFrom( array::ptr objects, size_t at ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 virtual void reorder( const size_t * order, size_t count ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 virtual void resize( size_t newSize ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 virtual void setItem( objRef obj, size_t atIndex ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 arrayMutable::ptr copy() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 array::ptr copyConst() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 void removeAt( size_t idx );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 void add( objRef obj ) {insert( obj, (size_t)(-1) ) ; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 void addFrom( array::ptr obj ) {insertFrom( obj, (size_t)(-1) ) ; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 static arrayMutable::ptr empty();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 static arrayMutable::ptr arrayWithArray( array::ptr source );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 static arrayMutable::ptr arrayWithObject( objRef source );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 static arrayMutable::ptr arrayWithCapacity(size_t capacity);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 class NOVTABLE string : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 FB2K_MAKE_SERVICE_INTERFACE( string, service_base );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 virtual const char * c_str() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 size_t length() const { return strlen(c_str()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 bool isEmpty() const { return *c_str() == 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 bool equals( const char * other ) const { return strcmp(c_str(), other) == 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 bool equals( string::ptr other ) const { return equals(other->c_str()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 static string::ptr stringWithString( const char * str );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 static string::ptr stringWithString( string::ptr str );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 static string::ptr stringWithString( const char * str, size_t len );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 static bool equalsNullSafe( string::ptr v1, string::ptr v2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 class NOVTABLE memBlock : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 FB2K_MAKE_SERVICE_INTERFACE( memBlock, service_base );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 virtual const void * data() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 virtual size_t size() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 const uint8_t * begin() const { return (const uint8_t*) data(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 const uint8_t * end() const { return begin() + size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 //! Album_art_data compatibility
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 size_t get_size() { return size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 //! Album_art_data compatibility
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 const void * get_ptr() { return data(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 memBlock::ptr copy() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 static memBlock::ptr empty();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 static memBlock::ptr blockWithData( const void * inData, size_t inSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 static memBlock::ptr blockWithBlock( memBlock::ptr block );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 template<typename vec_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 static memBlock::ptr blockWithVector(const vec_t & vec) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 auto size = vec.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 if (size == 0) return empty();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 return blockWithData(&vec[0], size * sizeof(vec[0]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 //! Create an object that takes ownership of this memory, without copying it; will call free() when done.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 static memBlock::ptr blockWithDataTakeOwnership(void * inData, size_t inSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 static memBlock::ptr blockWithData(pfc::mem_block const &);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 static memBlock::ptr blockWithData(pfc::mem_block && );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 //! Determine whether two memBlock objects store the same content.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 static bool equals(memBlock const & v1, memBlock const & v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 const t_size s = v1.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 if (s != v2.size()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 return memcmp(v1.data(), v2.data(),s) == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 static bool equals(ptr const& v1, ptr const& v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 if (v1.is_valid() != v2.is_valid()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 if (v1.is_empty() && v2.is_empty()) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 return equals(*v1, *v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 bool operator==(const memBlock & other) const {return equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 bool operator!=(const memBlock & other) const {return !equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 class NOVTABLE memBlockMutable : public memBlock {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 FB2K_MAKE_SERVICE_INTERFACE( memBlockMutable, memBlock );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 virtual void * dataMutable() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 //! Resizes preserving content. When expanding, contents of newly allocated area are undefined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 virtual void resize( size_t size ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 //! Resizes without preserving content. Contents undefined afterwards.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 virtual void resizeDiscard( size_t size ) { resize( size ); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 memBlockMutable::ptr copy() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 memBlock::ptr copyConst() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 static memBlockMutable::ptr empty();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 static memBlockMutable::ptr blockWithSize( size_t initSize );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 static memBlockMutable::ptr blockWithData( const void * inData, size_t inSize );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 static memBlockMutable::ptr blockWithBlock( memBlock::ptr block );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 bool operator==(const memBlockMutable & other) const {return equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 bool operator!=(const memBlockMutable & other) const {return !equals(*this,other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 //! Asynchronous object return helper. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 //! If the operation has failed for some reason, receiveObj() will be called with null object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 class objReceiver : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 FB2K_MAKE_SERVICE_INTERFACE( objReceiver, service_base );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 virtual void receiveObj( objRef obj ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 typedef objReceiver::ptr objReceiverRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 typedef ::completion_notify completionNotify;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 typedef completionNotify::ptr completionNotifyRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 typedef array::ptr arrayRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 typedef arrayMutable::ptr arrayMutableRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 typedef string::ptr stringRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 typedef memBlock::ptr memBlockRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 typedef memBlockMutable::ptr memBlockMutableRef;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 stringRef makeString( const wchar_t * str );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 stringRef makeString( const wchar_t * str, size_t len );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 inline stringRef makeString( const char * str ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 return string::stringWithString ( str );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 inline stringRef makeString( const char * str, size_t len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 return string::stringWithString ( str, len );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 inline arrayRef makeArray( std::initializer_list<objRef> const & arg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 return array::arrayWithObjects( arg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 inline memBlockRef makeMemBlock( const void * data, size_t size ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 return memBlock::blockWithData( data, size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 void describe( objRef obj, pfc::string_formatter & output, unsigned indent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 void describeDebug( objRef obj );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 typedef std::function< void (objRef) > objReceiverFunc_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 objReceiverRef makeObjReceiver( objReceiverFunc_t );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 template<typename class_t> objReceiverRef makeObjReceiverTyped(std::function< void(service_ptr_t<class_t>) > func) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 return makeObjReceiver([=](objRef obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 if (obj.is_empty()) func(nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 service_ptr_t<class_t> temp; temp ^= obj; func(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 objRef callOnRelease( std::function< void () > );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 objRef callOnReleaseInMainThread( std::function< void () > );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 arrayRef makeArrayDeferred( std::function< arrayRef () > f );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 inline pfc::string_base & operator<<(pfc::string_base & p_fmt, fb2k::stringRef str) { p_fmt.add_string(str->c_str()); return p_fmt; }