move cs_allocator out of cs_shared_state
parent
b81e419db6
commit
f41462deaf
|
@ -40,6 +40,28 @@ inline void cs_do_and_cleanup(F1 &&dof, F2 &&clf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cs_strman;
|
struct cs_strman;
|
||||||
|
struct cs_shared_state;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct cs_allocator {
|
||||||
|
using value_type = T;
|
||||||
|
|
||||||
|
cs_allocator(cs_shared_state *s): state{s} {}
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
cs_allocator(cs_allocator<U> const &a): state{a.state} {};
|
||||||
|
|
||||||
|
inline T *allocate(std::size_t n);
|
||||||
|
|
||||||
|
inline void deallocate(T *p, std::size_t n);
|
||||||
|
|
||||||
|
template<typename U>
|
||||||
|
bool operator==(cs_allocator<U> const &a) {
|
||||||
|
return state == a.state;
|
||||||
|
}
|
||||||
|
|
||||||
|
cs_shared_state *state;
|
||||||
|
};
|
||||||
|
|
||||||
struct cs_shared_state {
|
struct cs_shared_state {
|
||||||
cs_map<ostd::string_range, cs_ident *> idents;
|
cs_map<ostd::string_range, cs_ident *> idents;
|
||||||
|
@ -80,33 +102,18 @@ struct cs_shared_state {
|
||||||
v->~T();
|
v->~T();
|
||||||
alloc(v, len * sizeof(T), 0);
|
alloc(v, len * sizeof(T), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
struct allocator {
|
|
||||||
using value_type = T;
|
|
||||||
|
|
||||||
allocator(cs_shared_state *s): state{s} {}
|
|
||||||
|
|
||||||
template<typename U>
|
|
||||||
allocator(allocator<U> const &a): state{a.state} {};
|
|
||||||
|
|
||||||
T *allocate(std::size_t n) {
|
|
||||||
return static_cast<T *>(state->alloc(nullptr, 0, n * sizeof(T)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deallocate(T *p, std::size_t n) {
|
|
||||||
state->alloc(p, n, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename U>
|
|
||||||
bool operator==(allocator<U> const &a) {
|
|
||||||
return state == a.state;
|
|
||||||
}
|
|
||||||
|
|
||||||
cs_shared_state *state;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T *cs_allocator<T>::allocate(std::size_t n) {
|
||||||
|
return static_cast<T *>(state->alloc(nullptr, 0, n * sizeof(T)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline void cs_allocator<T>::deallocate(T *p, std::size_t n) {
|
||||||
|
state->alloc(p, n, 0);
|
||||||
|
}
|
||||||
|
|
||||||
inline cs_shared_state *cs_get_sstate(cs_state &cs) {
|
inline cs_shared_state *cs_get_sstate(cs_state &cs) {
|
||||||
return cs.p_state;
|
return cs.p_state;
|
||||||
}
|
}
|
||||||
|
@ -137,7 +144,7 @@ struct cs_strref_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cs_strman {
|
struct cs_strman {
|
||||||
using allocator_type = cs_shared_state::allocator<
|
using allocator_type = cs_allocator<
|
||||||
std::pair<ostd::string_range const, cs_strref_state *>
|
std::pair<ostd::string_range const, cs_strref_state *>
|
||||||
>;
|
>;
|
||||||
cs_strman() = delete;
|
cs_strman() = delete;
|
||||||
|
@ -199,11 +206,11 @@ struct cs_valbuf {
|
||||||
cs_valbuf() = delete;
|
cs_valbuf() = delete;
|
||||||
|
|
||||||
cs_valbuf(cs_shared_state &cs):
|
cs_valbuf(cs_shared_state &cs):
|
||||||
buf{cs_shared_state::allocator<T>{&cs}}
|
buf{cs_allocator<T>{&cs}}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
cs_valbuf(cs_state &cs):
|
cs_valbuf(cs_state &cs):
|
||||||
buf{cs_shared_state::allocator<T>{cs_get_sstate(cs)}}
|
buf{cs_allocator<T>{cs_get_sstate(cs)}}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
using size_type = std::size_t;
|
using size_type = std::size_t;
|
||||||
|
@ -237,7 +244,7 @@ struct cs_valbuf {
|
||||||
T *data() { return &buf[0]; }
|
T *data() { return &buf[0]; }
|
||||||
T const *data() const { return &buf[0]; }
|
T const *data() const { return &buf[0]; }
|
||||||
|
|
||||||
std::vector<T, cs_shared_state::allocator<T>> buf;
|
std::vector<T, cs_allocator<T>> buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cs_charbuf: cs_valbuf<char> {
|
struct cs_charbuf: cs_valbuf<char> {
|
||||||
|
|
Loading…
Reference in New Issue