Add make_unique.hpp and split.hpp
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Nathan L. Binkert <nate@binkert.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __MAKE_UNIQUE_HH__
|
||||
#define __MAKE_UNIQUE_HH__
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace std {
|
||||
namespace detail {
|
||||
|
||||
// helper to construct a non-array unique_ptr
|
||||
template <typename T>
|
||||
struct make_unique_helper {
|
||||
typedef std::unique_ptr<T> unique_ptr;
|
||||
|
||||
template <typename... Args>
|
||||
static inline unique_ptr make(Args&&... args) {
|
||||
return unique_ptr(new T(std::forward<Args>(args)...));
|
||||
}
|
||||
};
|
||||
|
||||
// helper to construct an array unique_ptr
|
||||
template<typename T>
|
||||
struct make_unique_helper<T[]> {
|
||||
typedef std::unique_ptr<T[]> unique_ptr;
|
||||
|
||||
template <typename... Args>
|
||||
static inline unique_ptr make(Args&&... args) {
|
||||
return unique_ptr(new T[sizeof...(Args)]{std::forward<Args>(args)...});
|
||||
}
|
||||
};
|
||||
|
||||
// helper to construct an array unique_ptr with specified extent
|
||||
template<typename T, std::size_t N>
|
||||
struct make_unique_helper<T[N]> {
|
||||
typedef std::unique_ptr<T[]> unique_ptr;
|
||||
|
||||
template <typename... Args>
|
||||
static inline unique_ptr make(Args&&... args) {
|
||||
static_assert(N >= sizeof...(Args),
|
||||
"For make_unique<T[N]> N must be as largs as the number of arguments");
|
||||
return unique_ptr(new T[N]{std::forward<Args>(args)...});
|
||||
}
|
||||
|
||||
#if __GNUC__ == 4 && __GNUC_MINOR__ <= 6
|
||||
// G++ 4.6 has an ICE when you have no arguments
|
||||
static inline unique_ptr make() {
|
||||
return unique_ptr(new T[N]);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename T, typename... Args>
|
||||
inline typename detail::make_unique_helper<T>::unique_ptr
|
||||
make_unique(Args&&... args) {
|
||||
return detail::make_unique_helper<T>::make(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
} // namespace std
|
||||
|
||||
#endif // __MAKE_UNIQUE_HH__
|
||||
@@ -0,0 +1,21 @@
|
||||
#ifndef SPLIT_INCLUDED
|
||||
# define SPLIT_INCLUDED
|
||||
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
namespace utils
|
||||
{
|
||||
std::vector<std::string> split(const std::string &s, const char delim)
|
||||
{
|
||||
std::vector<std::string> ret;
|
||||
std::stringstream ss(s);
|
||||
std::string item;
|
||||
while (std::getline(ss, item, delim))
|
||||
ret.emplace_back(std::move(item));
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // SPLIT_INCLUDED
|
||||
Reference in New Issue
Block a user