#ifndef CEPH_COMPACT_MAP_H
#define CEPH_COMPACT_MAP_H
+#include "buffer.h"
+#include "encoding.h"
+
#include <map>
+#include <memory>
#include "include/encoding.h"
template <class Key, class T, class Map>
class compact_map_base {
protected:
- Map *map;
+ std::unique_ptr<Map> map;
void alloc_internal() {
if (!map)
- map = new Map;
+ map.reset(new Map);
}
void free_internal() {
- if (map) {
- delete map;
- map = 0;
- }
+ map.reset();
}
template <class It>
class const_iterator_base {
const_reverse_iterator(const compact_map_base* m, const typename Map::const_reverse_iterator& i)
: const_iterator_base<typename Map::const_reverse_iterator>(m, i) { }
};
- compact_map_base() : map(0) {}
- compact_map_base(const compact_map_base& o) : map(0) {
+ compact_map_base(const compact_map_base& o) {
if (o.map) {
alloc_internal();
*map = *o.map;
}
}
- ~compact_map_base() { delete map; }
+ compact_map_base() {}
+ ~compact_map_base() {}
bool empty() const {
return !map || map->empty();
if (map) {
assert(this == p.map);
map->erase(p.it);
- if (map->empty())
- free_internal();
+ if (map->empty()) {
+ free_internal();
+ }
}
}
size_t erase (const Key& k) {
free_internal();
}
void swap(compact_map_base& o) {
- Map *tmp = map;
- map = o.map;
- o.map = tmp;
+ map.swap(o.map);
}
compact_map_base& operator=(const compact_map_base& o) {
if (o.map) {
m.decode(p);
}
-template <class Key, class T>
-class compact_map : public compact_map_base<Key, T, std::map<Key,T> > {
+template <class Key, class T, class Compare = std::less<Key>, class Alloc = std::allocator< std::pair<const Key, T> > >
+class compact_map : public compact_map_base<Key, T, std::map<Key,T,Compare,Alloc> > {
public:
T& operator[](const Key& k) {
this->alloc_internal();
}
};
-template <class Key, class T>
-inline std::ostream& operator<<(std::ostream& out, const compact_map<Key, T>& m)
+template <class Key, class T, class Compare = std::less<Key>, class Alloc = std::allocator< std::pair<const Key, T> > >
+inline std::ostream& operator<<(std::ostream& out, const compact_map<Key, T, Compare, Alloc>& m)
{
out << "{";
- for (typename compact_map<Key, T>::const_iterator it = m.begin();
- it != m.end();
- ++it) {
- if (it != m.begin())
+ bool first = true;
+ for (const auto &p : m) {
+ if (!first)
out << ",";
- out << it->first << "=" << it->second;
+ out << p.first << "=" << p.second;
+ first = false;
}
out << "}";
return out;
}
-template <class Key, class T>
-class compact_multimap : public compact_map_base<Key, T, std::multimap<Key,T> > {
+template <class Key, class T, class Compare = std::less<Key>, class Alloc = std::allocator< std::pair<const Key, T> > >
+class compact_multimap : public compact_map_base<Key, T, std::multimap<Key,T,Compare,Alloc> > {
};
-template <class Key, class T>
-inline std::ostream& operator<<(std::ostream& out, const compact_multimap<Key, T>& m)
+template <class Key, class T, class Compare = std::less<Key>, class Alloc = std::allocator< std::pair<const Key, T> > >
+inline std::ostream& operator<<(std::ostream& out, const compact_multimap<Key, T, Compare, Alloc>& m)
{
out << "{{";
- for (typename compact_map<Key, T>::const_iterator it = m.begin(); !it.end(); ++it) {
- if (it != m.begin())
+ bool first = true;
+ for (const auto &p : m) {
+ if (!first)
out << ",";
- out << it->first << "=" << it->second;
+ out << p.first << "=" << p.second;
+ first = false;
}
out << "}}";
return out;
#ifndef CEPH_COMPACT_SET_H
#define CEPH_COMPACT_SET_H
-#include <stdlib.h>
-
-#include "include/buffer.h"
-#include "include/encoding.h"
+#include "buffer.h"
+#include "encoding.h"
+#include <memory>
+#include <set>
template <class T, class Set>
class compact_set_base {
protected:
- Set *set;
+ std::unique_ptr<Set> set;
void alloc_internal() {
if (!set)
- set = new Set;
+ set.reset(new Set);
}
void free_internal() {
- if (set) {
- delete set;
- set = 0;
- }
+ set.reset();
}
template <class It>
class iterator_base {
}
};
- compact_set_base() : set(0) {}
- compact_set_base(const compact_set_base& o) : set(0) {
+ compact_set_base() {}
+ compact_set_base(const compact_set_base& o) {
if (o.set) {
alloc_internal();
*set = *o.set;
}
}
- ~compact_set_base() { delete set; }
+ ~compact_set_base() {}
bool empty() const {
assert(this == p.set);
set->erase(p.it);
if (set->empty())
- free_internal();
+ free_internal();
}
}
size_t erase (const T& t) {
return 0;
size_t r = set->erase(t);
if (set->empty())
- free_internal();
+ free_internal();
return r;
}
void clear() {
free_internal();
}
void swap(compact_set_base& o) {
- Set *tmp = set;
- set = o.set;
- o.set = tmp;
+ set.swap(o.set);
}
compact_set_base& operator=(const compact_set_base& o) {
if (o.set) {
m.decode(p);
}
-template <class T>
-class compact_set : public compact_set_base<T, std::set<T> > {
+template <class T, class Compare = std::less<T>, class Alloc = std::allocator<T> >
+class compact_set : public compact_set_base<T, std::set<T, Compare, Alloc> > {
};
-template <class T>
-inline std::ostream& operator<<(std::ostream& out, const compact_set<T>& s)
+template <class T, class Compare = std::less<T>, class Alloc = std::allocator<T> >
+inline std::ostream& operator<<(std::ostream& out, const compact_set<T,Compare,Alloc>& s)
{
- for (typename compact_set<T>::const_iterator it = s.begin();
- it != s.end(); ++it) {
- if (it != s.begin())
+ bool first = true;
+ for (auto &v : s) {
+ if (!first)
out << ",";
- out << it->first << "=" << it->second;
+ out << v;
+ first = false;
}
return out;
}
#include <common/Formatter.h>
#include "include/assert.h"
+#include "include/compact_map.h"
+#include "include/compact_set.h"
/*
using map = std::map<k, v, cmp, \
pool_allocator<std::pair<const k,v>>>; \
\
+ template<typename k,typename v, typename cmp = std::less<k> > \
+ using compact_map = compact_map<k, v, cmp, \
+ pool_allocator<std::pair<const k,v>>>; \
+ \
+ template<typename k, typename cmp = std::less<k> > \
+ using compact_set = compact_set<k, cmp, pool_allocator<k>>; \
+ \
template<typename k,typename v, typename cmp = std::less<k> > \
using multimap = std::multimap<k,v,cmp, \
pool_allocator<std::pair<const k, \