69 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #pragma once
 | |
| 
 | |
| #if !defined(MIJIN_UTIL_STRING_HPP_INCLUDED)
 | |
| #define MIJIN_UTIL_STRING_HPP_INCLUDED 1
 | |
| 
 | |
| #include <iterator>
 | |
| #include <sstream>
 | |
| #include <string>
 | |
| 
 | |
| namespace mijin
 | |
| {
 | |
| 
 | |
| //
 | |
| // public defines
 | |
| //
 | |
| 
 | |
| //
 | |
| // public constants
 | |
| //
 | |
| 
 | |
| //
 | |
| // public types
 | |
| //
 | |
| 
 | |
| //
 | |
| // public functions
 | |
| //
 | |
| 
 | |
| template <typename TRange, typename TValue = typename TRange::value_type>
 | |
| std::string join(const TRange& elements, const char* const delimiter)
 | |
| {
 | |
|     std::ostringstream oss;
 | |
|     auto first = std::begin(elements);
 | |
|     auto last = std::end(elements);
 | |
| 
 | |
|     if (first != last)
 | |
|     {
 | |
|         std::copy(first, std::prev(last), std::ostream_iterator<TValue>(oss, delimiter));
 | |
|         first = std::prev(last);
 | |
|     }
 | |
|     if (first != last)
 | |
|     {
 | |
|         oss << *first;
 | |
|     }
 | |
| 
 | |
|     return oss.str();
 | |
| }
 | |
| 
 | |
| namespace pipe
 | |
| {
 | |
| struct Join
 | |
| {
 | |
|     const char* delimiter;
 | |
| 
 | |
|     explicit Join(const char* delimiter_) noexcept : delimiter(delimiter_) {}
 | |
| };
 | |
| 
 | |
| template<typename TIterable>
 | |
| auto operator|(TIterable&& iterable, const Join& joiner)
 | |
| {
 | |
|     return join(std::forward<TIterable>(iterable), joiner.delimiter);
 | |
| }
 | |
| }
 | |
| 
 | |
| } // namespace mijin
 | |
| 
 | |
| #endif // !defined(MIJIN_UTIL_STRING_HPP_INCLUDED)
 |