[med-svn] [libgtextutils] 25/83: Cleaned 'container_join', added usage examples.

Charles Plessy plessy at moszumanska.debian.org
Wed Jan 8 13:37:26 UTC 2014


This is an automated email from the git hooks/post-receive script.

plessy pushed a commit to branch debian/unstable
in repository libgtextutils.

commit edb807fc6001f3a3d07e07a16ed5f8363521d56a
Author: A. Gordon <gordon at cshl.edu>
Date:   Tue Mar 24 16:44:48 2009 -0400

    Cleaned 'container_join', added usage examples.
---
 src/gtextutils/container_join.h | 201 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 201 insertions(+)

diff --git a/src/gtextutils/container_join.h b/src/gtextutils/container_join.h
new file mode 100755
index 0000000..7c6a7c4
--- /dev/null
+++ b/src/gtextutils/container_join.h
@@ -0,0 +1,201 @@
+/*
+   Gordon's Text-Utilities Library
+   Copyright (C) 2009 Assaf Gordon (gordon at cshl.edu)
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Affero General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Affero General Public License for more details.
+
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>
+*/
+#ifndef __LIBGTEXTUTILS_CONTAINER_JOIN_H__
+#define __LIBGTEXTUTILS_CONTAINER_JOIN_H__
+
+/* 
+ * Easily joins a container and outputs it to a stream.
+ * 
+ * Tries to emulate Perl's join in an STL way.
+
+Usage:
+
+ send container's elements into an output-stream:
+
+	STD::OSTREAM << join ( CONTAINER, [DELIMITER] ) ;
+	STD::OSTREAM << join ( BEGIN-ITERATOR, END-ITERATOR, [DELIMITER] ) ;
+
+ send container's elements into a string:
+
+	STD::STRING = join ( CONTAINER, [DELIMITER] ) ;
+	STD::STRING = join ( BEGIN-ITERATOR, END-ITERATOR, [DELIMITER] ) ;
+
+	[DELIMITER] = optional std::string, will be used as delimiter between two elements.
+	              defaults to a single tab.
+		      can contain multiple characters.
+
+Usage example:
+
+	// A simple container (could also be a list/deque/stack/whatever):
+	vector<int> v;
+	for (int i=0;i<10;++i)
+		v.push_back(i);
+
+	// Print the entire container:
+	cout << join(v,",") << endl;
+	// Will output:  0,1,2,3,4,5,6,7,8,9
+
+	// Print specific range, using begin/end iterators
+	cout << join(v.begin(), v.end(),"-") << endl;
+	// Will output: 0-1-2-3-4-5-6-7-8-9
+
+	// An std::pair<> based container 
+	// map/set/multimap/multiset/unorederd_map etc.
+	//   or
+	// vector< pair<A,B> > etc.
+	map<int, string> m;
+	m[42] = "Don't Panic";
+	m[666]= "Beast" ;
+	
+	// Print the first values (of the pair) of the entire container:
+	cout << "keys  = " << join_firsts(m) << endl;
+	// Will output: 42 <tab> 666
+
+	// Print the first values (of the pair) of a specific range:
+	cout << "keys  = " << join_firsts(m.begin(), m.end(), ",") << endl;
+	// Will output: 42,666
+
+	// Print the second values (of the pair) of the entire container:
+	cout << "values= " << join_seconds(m) << endl;
+	// Will output: Don't Panic<tab>Beast
+
+	// Print the second values (of the pair) of a specific range:
+	cout << "values= " << join_seconds(m.begin(), m.end(), ",") << endl;
+	// Will output: Don't Panic,Beast
+
+
+	// Store result in a string (instead of an output stream):
+	string s = join_firsts(m);
+	// 's' will contain: "42\t666";
+
+
+*/
+
+
+#include <ostream>
+#include <sstream>
+#include <iostream>
+#include <iterator>
+#include <algorithm>
+
+template<typename ITERATOR, typename OP> 
+struct joiner
+{
+	joiner ( ITERATOR _begin, ITERATOR _end, const std::string& _delimiter="\t" ) : 
+		begin(_begin), 
+		end(_end),
+		delimiter(_delimiter)
+	{} 
+
+	ITERATOR begin, end;
+	std::string delimiter;
+	OP op;
+
+	operator std::string() const
+	{
+		std::ostringstream os;
+		os << *this;
+		return os.str();
+	}
+};
+
+template<typename ITERATOR, typename OP>
+inline std::ostream& operator<< ( std::ostream& strm, const joiner<ITERATOR, OP>& j )
+{
+	ITERATOR it = j.begin;
+	if (it != j.end) {
+		//first element - doesn't need a delimiter
+		strm << j.op(*it);
+		it++;
+	}
+	for (; it != j.end ; ++it) {
+		//print a delimiter before all other elements
+		strm << j.delimiter ;
+		strm << j.op(*it);
+	}
+	return strm;
+}
+
+template <typename T>
+struct joiner_noop
+{
+const T& operator() (const T& t) const { return t; }
+};
+
+template <typename FIRST, typename SECOND>
+struct joiner_select1st
+{
+const FIRST& operator() ( const std::pair<FIRST,SECOND>& pair ) const { return pair.first ; }
+};
+
+template <typename FIRST, typename SECOND>
+struct joiner_select2nd
+{
+const SECOND& operator() ( const std::pair<FIRST,SECOND>& pair ) const { return pair.second; }
+};
+
+template<typename ITERATOR >
+inline 
+joiner< ITERATOR, joiner_noop<typename ITERATOR::value_type> > 
+join(ITERATOR begin, ITERATOR end, const std::string& delimiter="\t")
+{
+	return joiner< ITERATOR, joiner_noop<typename ITERATOR::value_type> > (begin, end, delimiter);
+}
+
+template<typename ITERATOR >
+inline 
+joiner< ITERATOR, joiner_select1st<typename ITERATOR::value_type::first_type, typename ITERATOR::value_type::second_type> > 
+join_firsts(ITERATOR begin, ITERATOR end, const std::string& delimiter="\t")
+{
+	return joiner< ITERATOR, joiner_select1st<typename ITERATOR::value_type::first_type, typename ITERATOR::value_type::second_type> > (begin, end, delimiter);
+}
+
+template<typename ITERATOR >
+inline 
+joiner< ITERATOR, joiner_select2nd<typename ITERATOR::value_type::first_type, typename ITERATOR::value_type::second_type> > 
+join_seconds(ITERATOR begin, ITERATOR end, const std::string& delimiter="\t")
+{
+	return joiner< ITERATOR, joiner_select2nd<typename ITERATOR::value_type::first_type, typename ITERATOR::value_type::second_type> > (begin, end, delimiter);
+}
+
+template<typename CONTAINER>
+inline 
+joiner< typename CONTAINER::const_iterator, joiner_noop<typename CONTAINER::value_type>	> 
+join(const CONTAINER& a, const std::string& delimiter="\t")
+{
+	return join(a.begin(), a.end(), delimiter);
+}
+
+
+template<typename CONTAINER>
+inline 
+joiner< typename CONTAINER::const_iterator, joiner_select1st<typename CONTAINER::value_type::first_type, typename CONTAINER::value_type::second_type> > 
+join_firsts(const CONTAINER& a, const std::string& delimiter="\t")
+{
+	return join_firsts(a.begin(), a.end(), delimiter);
+}
+
+template<typename CONTAINER>
+inline 
+joiner< typename CONTAINER::const_iterator, joiner_select2nd<typename CONTAINER::value_type::first_type, typename CONTAINER::value_type::second_type> > 
+join_seconds(const CONTAINER& a, const std::string& delimiter="\t")
+{
+	return join_seconds(a.begin(), a.end(), delimiter);
+}
+
+#endif

-- 
Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/libgtextutils.git



More information about the debian-med-commit mailing list