<commit_before>#ifndef STINGRAY_TOOLKIT_MEMBERLISTCOMPARER_H
#define STINGRAY_TOOLKIT_MEMBERLISTCOMPARER_H

#include <stingray/toolkit/MemberToValueComparer.h>
#include <stingray/toolkit/Tuple.h>
#include <stingray/toolkit/comparers.h>
#include <stingray/toolkit/shared_ptr.h>

namespace stingray
{

	namespace Detail
	{
		template <typename MemberPointerTuple>
		struct MemberListComparerImpl
		{
			template <typename ClassType, typename MemberPointerType>
			static int CompareMember(const ClassType &lhs, const ClassType &rhs, const MemberPointerType &pointer)
			{
				typedef MemberExtractor<MemberPointerType> Extractor;
				return comparers::Cmp()(Extractor::GetValue(lhs, pointer), Extractor::GetValue(rhs, pointer));
			}

			template <typename ClassType, typename MemberPointerT, typename ComparerT>
			static int CompareMember(const ClassType &lhs, const ClassType &rhs, const CustomMemberComparerWrapper<MemberPointerT, ComparerT> &comparer)
			{ return comparer.Compare(lhs, rhs); }

			template <typename ClassType>
			static int Do(const ClassType &lhs, const ClassType &rhs, const MemberPointerTuple &tuple)
			{
				int result = CompareMember(lhs, rhs, tuple.GetHead());
				if (result == 0)
					return MemberListComparerImpl<typename MemberPointerTuple::Tail>::Do(lhs, rhs, tuple.GetTail());
				return result;
			}
		};


		template < >
		struct MemberListComparerImpl<Tuple<TypeListEndNode> >
		{
			template <typename ClassType>
			static int Do(const ClassType &lhs, const ClassType &rhs, const Tuple<TypeListEndNode> &tuple)
			{ return 0; }
		};
	}


	template <typename MemberPointerTuple>
	struct MemberListComparer : public comparers::CmpComparerBase<MemberListComparer<MemberPointerTuple> >
	{
	private:
		MemberPointerTuple _memberPointerList;

	public:
		MemberListComparer(const MemberPointerTuple& memberPointerList) : _memberPointerList(memberPointerList)
		{ }

		template <typename T>
		int DoCompare(const T& lhs, const T& rhs) const
		{ return Detail::MemberListComparerImpl<MemberPointerTuple>::Do(lhs, rhs, _memberPointerList); }
	};


	template <typename IntComparer, template<typename> class Adapter>
	struct CmpAdapter
	{
	private:
		IntComparer _comparer;
		Adapter<int> _adapter;
	public:
		CmpAdapter(): _comparer(), _adapter()
		{}
		CmpAdapter(const IntComparer& comparer, const Adapter<int> &adapter = Adapter<int>())
			: _comparer(comparer), _adapter(adapter)
		{}
		template <typename ClassType1, typename ClassType2>
		int operator ()(const ClassType1 &lhs, const ClassType2 &rhs) const
		{
			return _adapter(_comparer(lhs, rhs), 0);
		}
	};

#define TY typename
#define P_(N) const T##N& p##N
#define DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(N_, TypesDecl_, TypesUsage_, ParamsDecl_, ParamsUsage_) \
	template < TypesDecl_ > \
	MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > CompareMembersCmp(ParamsDecl_) \
	{ return MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_)); } \
	template <TypesDecl_> \
	CmpAdapter<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >, std::less> CompareMembersLess(ParamsDecl_) \
	{ return CmpAdapter<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >, std::less>(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_), std::less<int>()); } \
	template <TypesDecl_> \
	CmpAdapter<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >, std::greater> CompareMembersGreater(ParamsDecl_) \
	{ return CmpAdapter<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >, std::greater>(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_), std::greater<int>()); } \
	template <TypesDecl_> \
	CmpAdapter<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >, std::equal_to> CompareMembersEquals(ParamsDecl_) \
	{ return CmpAdapter<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >, std::equal_to>(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_), std::equal_to<int>()); }


	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(1, MK_PARAM(TY T1), MK_PARAM(T1), MK_PARAM(P_(1)), MK_PARAM(p1));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(2, MK_PARAM(TY T1, TY T2), MK_PARAM(T1, T2), MK_PARAM(P_(1), P_(2)), MK_PARAM(p1, p2));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(3, MK_PARAM(TY T1, TY T2, TY T3), MK_PARAM(T1, T2, T3), MK_PARAM(P_(1), P_(2), P_(3)), MK_PARAM(p1, p2, p3));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(4, MK_PARAM(TY T1, TY T2, TY T3, TY T4), MK_PARAM(T1, T2, T3, T4), MK_PARAM(P_(1), P_(2), P_(3), P_(4)), MK_PARAM(p1, p2, p3, p4));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(5, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5), MK_PARAM(T1, T2, T3, T4, T5), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5)), MK_PARAM(p1, p2, p3, p4, p5));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(6, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6), MK_PARAM(T1, T2, T3, T4, T5, T6), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6)), MK_PARAM(p1, p2, p3, p4, p5, p6));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(7, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7), MK_PARAM(T1, T2, T3, T4, T5, T6, T7), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(8, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(9, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(10, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(11, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(12, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(13, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12, TY T13), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12), P_(13)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(14, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12, TY T13, TY T14), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12), P_(13), P_(14)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(15, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12, TY T13, TY T14, TY T15), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12), P_(13), P_(14), P_(15)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15));<commit_msg>Replaced CmpAdapter<...> with more straightforward comparers::CmpToXXX<...><commit_after>#ifndef STINGRAY_TOOLKIT_MEMBERLISTCOMPARER_H
#define STINGRAY_TOOLKIT_MEMBERLISTCOMPARER_H

#include <stingray/toolkit/MemberToValueComparer.h>
#include <stingray/toolkit/Tuple.h>
#include <stingray/toolkit/comparers.h>
#include <stingray/toolkit/shared_ptr.h>

namespace stingray
{

	namespace Detail
	{
		template <typename MemberPointerTuple>
		struct MemberListComparerImpl
		{
			template <typename ClassType, typename MemberPointerType>
			static int CompareMember(const ClassType &lhs, const ClassType &rhs, const MemberPointerType &pointer)
			{
				typedef MemberExtractor<MemberPointerType> Extractor;
				return comparers::Cmp()(Extractor::GetValue(lhs, pointer), Extractor::GetValue(rhs, pointer));
			}

			template <typename ClassType, typename MemberPointerT, typename ComparerT>
			static int CompareMember(const ClassType &lhs, const ClassType &rhs, const CustomMemberComparerWrapper<MemberPointerT, ComparerT> &comparer)
			{ return comparer.Compare(lhs, rhs); }

			template <typename ClassType>
			static int Do(const ClassType &lhs, const ClassType &rhs, const MemberPointerTuple &tuple)
			{
				int result = CompareMember(lhs, rhs, tuple.GetHead());
				if (result == 0)
					return MemberListComparerImpl<typename MemberPointerTuple::Tail>::Do(lhs, rhs, tuple.GetTail());
				return result;
			}
		};


		template < >
		struct MemberListComparerImpl<Tuple<TypeListEndNode> >
		{
			template <typename ClassType>
			static int Do(const ClassType &lhs, const ClassType &rhs, const Tuple<TypeListEndNode> &tuple)
			{ return 0; }
		};
	}


	template <typename MemberPointerTuple>
	struct MemberListComparer : public comparers::CmpComparerBase<MemberListComparer<MemberPointerTuple> >
	{
	private:
		MemberPointerTuple _memberPointerList;

	public:
		MemberListComparer(const MemberPointerTuple& memberPointerList) : _memberPointerList(memberPointerList)
		{ }

		template <typename T>
		int DoCompare(const T& lhs, const T& rhs) const
		{ return Detail::MemberListComparerImpl<MemberPointerTuple>::Do(lhs, rhs, _memberPointerList); }
	};


	template <typename IntComparer, template<typename> class Adapter>
	struct CmpAdapter
	{
	private:
		IntComparer _comparer;
		Adapter<int> _adapter;
	public:
		CmpAdapter(): _comparer(), _adapter()
		{}
		CmpAdapter(const IntComparer& comparer, const Adapter<int> &adapter = Adapter<int>())
			: _comparer(comparer), _adapter(adapter)
		{}
		template <typename ClassType1, typename ClassType2>
		int operator ()(const ClassType1 &lhs, const ClassType2 &rhs) const
		{
			return _adapter(_comparer(lhs, rhs), 0);
		}
	};

#define TY typename
#define P_(N) const T##N& p##N
#define DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(N_, TypesDecl_, TypesUsage_, ParamsDecl_, ParamsUsage_) \
	template < TypesDecl_ > \
	MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > CompareMembersCmp(ParamsDecl_) \
	{ return MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > >(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_)); } \
	template <TypesDecl_> \
	comparers::CmpToLess<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > > CompareMembersLess(ParamsDecl_) \
	{ return comparers::CmpToLess<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > >(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_)); } \
	template <TypesDecl_> \
	comparers::CmpToGreater<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > > CompareMembersGreater(ParamsDecl_) \
	{ return comparers::CmpToGreater<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > >(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_)); } \
	template <TypesDecl_> \
	comparers::CmpToEquals<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > > CompareMembersEquals(ParamsDecl_) \
	{ return comparers::CmpToEquals<MemberListComparer<Tuple<TypeList_##N_<TypesUsage_> > > >(Tuple<TypeList_##N_<TypesUsage_> >(ParamsUsage_)); }


	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(1, MK_PARAM(TY T1), MK_PARAM(T1), MK_PARAM(P_(1)), MK_PARAM(p1));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(2, MK_PARAM(TY T1, TY T2), MK_PARAM(T1, T2), MK_PARAM(P_(1), P_(2)), MK_PARAM(p1, p2));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(3, MK_PARAM(TY T1, TY T2, TY T3), MK_PARAM(T1, T2, T3), MK_PARAM(P_(1), P_(2), P_(3)), MK_PARAM(p1, p2, p3));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(4, MK_PARAM(TY T1, TY T2, TY T3, TY T4), MK_PARAM(T1, T2, T3, T4), MK_PARAM(P_(1), P_(2), P_(3), P_(4)), MK_PARAM(p1, p2, p3, p4));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(5, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5), MK_PARAM(T1, T2, T3, T4, T5), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5)), MK_PARAM(p1, p2, p3, p4, p5));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(6, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6), MK_PARAM(T1, T2, T3, T4, T5, T6), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6)), MK_PARAM(p1, p2, p3, p4, p5, p6));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(7, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7), MK_PARAM(T1, T2, T3, T4, T5, T6, T7), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(8, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(9, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(10, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(11, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(12, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(13, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12, TY T13), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12), P_(13)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(14, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12, TY T13, TY T14), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12), P_(13), P_(14)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14));
	DETAIL_TOOLKIT_DECLARE_MAKEMEMBERLISTCOMPARER(15, MK_PARAM(TY T1, TY T2, TY T3, TY T4, TY T5, TY T6, TY T7, TY T8, TY T9, TY T10, TY T11, TY T12, TY T13, TY T14, TY T15), MK_PARAM(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), MK_PARAM(P_(1), P_(2), P_(3), P_(4), P_(5), P_(6), P_(7), P_(8), P_(9), P_(10), P_(11), P_(12), P_(13), P_(14), P_(15)), MK_PARAM(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15));
{'fraction_non_alphanumeric': 0.16775599128540306, 'fraction_numerical': 0.07370059134765017, 'mean_word_length': 6.049583150504607, 'pattern_counts': {'":': 0, '<': 146, '<?xml version=': 0, '>': 146, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 64, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1314987', 'n_tokens_mistral': 7915, 'n_tokens_neox': 7309, 'n_words': 1710}