⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datagenerators.h

📁 loki库的源代码。loki库是以模板技术和面向对象技术为基础的c++类库。
💻 H
字号:
////////////////////////////////////////////////////////////////////////////////
// The Loki Library
// Data Generator by Mr. Shannon Barber
// This code DOES NOT accompany the book:
// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design 
//     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
//
// Code covered by the MIT License
//
// The author makes no representations about the suitability of this software
//  for any purpose. It is provided "as is" without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////

// Last update: Oct 10, 2002

#pragma once
#include "Typelist.h"

//MSVC7 version
namespace Loki
{
////////////////////////////////////////////////////////////////////////////////
// class template IterateTypes
////////////////////////////////////////////////////////////////////////////////
	namespace TL
		{
		template<typename T>
		struct nameof_type
			{
			const char* operator()()
				{
				return typeid(T).name();
				}
			};
		template<typename T>
		struct sizeof_type
			{
			size_t operator()()
				{
				return sizeof(T);
				}
			};    
    template <class TList, template <typename> class UnitFunc>
    struct IterateTypes;

    namespace Private
    {
    // for some reason VC7 needs the base definition altough not in use
    template <typename TListTag> 
    struct IterateTypesHelper1
    {
        template <typename T, template <typename> class GenFunc>
        struct In 
        { 
            typedef typename T::ERROR_THIS_INSTANCE_SELECTED Result; 
        };
    };

    template <typename TListTag> 
    struct IterateTypesHelper2
    {
        template <typename T, template <typename> class GenFunc>
        struct In 
        { 
            typedef typename T::ERROR_THIS_INSTANCE_SELECTED Result; 
        };
    };

    
    template <> 
    struct IterateTypesHelper1<TL::Typelist_tag>
    {
        template <class TList, template <typename> class GenFunc>
        struct In
        {
            typedef IterateTypes<typename TList::Head, GenFunc> Result;
        };
    };

    template <> 
    struct IterateTypesHelper2<TL::Typelist_tag>
    {
        template <class TList, template <typename> class GenFunc>
        struct In
        {
            typedef IterateTypes<typename TList::Tail, GenFunc> Result;
        };
    };
    

    template <> 
    struct IterateTypesHelper1<TL::NoneList_tag>
    {
        template <typename AtomicType, template <typename> class GenFunc>
        struct In 
        { 
            struct Result
            {
				typedef GenFunc<AtomicType> genfunc_t;
                template<class II>
                void operator()(II ii)
                {
                genfunc_t gen;
				//warning C4267: 'argument' : conversion from 'size_t' to 'const std::_Vbase', possible loss of data
#pragma warning(push)
#pragma warning(disable: 4267)
				//TODOSGB
				*ii = gen();
#pragma warning(pop)
				++ii;
                }
                template<class II, class P1>
                void operator()(II ii, P1 p1)
                {
                    genfunc_t gen;
						  *ii = gen(p1);
						  ++ii;
                }
            };
        };
    };

    template <> 
    struct IterateTypesHelper2<TL::NoneList_tag>
    {
        template <typename AtomicType, template <typename> class GenFunc>
        struct In 
        { 
            struct Result 
            {
                template<class II> void operator()(II) {}
				    template<class II, class P1> void operator()(II, P1) {}
            }; 
        };        
    };


    template <> 
    struct IterateTypesHelper1<TL::NullType_tag>
    {
        template <class TList, template <typename> class GenFunc>
        struct In 
        { 
            struct Result 
            {
                template<class II> void operator()(II) {}
				    template<class II, class P1> void operator()(II, P1) {}
				}; 
        };        
    };

    template <> 
    struct IterateTypesHelper2<TL::NullType_tag>
    {
        template <class TList, template <typename> class GenFunc>
        struct In 
        { 
            struct Result 
            {
                template<class II> void operator()(II) {}
				    template<class II, class P1> void operator()(II, P1) {}
            }; 
        };        
    };

    } // namespace Private



////////////////////////////////////////////////////////////////////////////////
// class template IterateTypes
// Iteratates a Typelist, and invokes the ctor of GenFunc<T>
// for each type in the list, passing a functor along the way.
// The functor is designed to be an insertion iterator which GenFunc<T>
// can use to output information about the types in the list.
////////////////////////////////////////////////////////////////////////////////

    
    template <typename T, template <typename> class GenFunc>
    struct IterateTypes
    {
    public:

        typedef typename Private::IterateTypesHelper1
        <
            typename TL::is_Typelist<T>::type_tag
        >
        ::template In<T, GenFunc>::Result head_t;

        typedef typename Private::IterateTypesHelper2
        <
            typename TL::is_Typelist<T>::type_tag
        >
        ::template In<T, GenFunc>::Result tail_t;
		  head_t head;
		  tail_t tail;

	     template<class II>
        void operator()(II ii)
        {
		  this->head.operator()(ii);
		  this->tail.operator()(ii);
		  }
	     template<class II, class P1>
        void operator()(II ii, P1 p1)
        {
		  this->head.operator()(ii, p1);
		  this->tail.operator()(ii, p1);
		  }
	 };

	//UnitFunc is really a template-template parameter, but MSVC7
	// chokes on the correct defintion.  Oddly enough, it works correctly
	// with the 'undecorated' template parameter declaraion!
	//template <class> class UnitFunc
	template<typename Types, class UnitFunc, typename II>
	void iterate_types(II ii)
		{
		Loki::TL::IterateTypes<Types, UnitFunc> it;
		it(ii);
		}
	}//ns TL
}//ns Loki

////////////////////////////////////////////////////////////////////////////////
// Change log:
// Aug 17, 2002:  Ported to MSVC7 by Rani Sharoni 
// Aug 18, 2002:  Removed ctor(II), replaced with operator(II) Shannon Barber
// Oct 10, 2002:  Changed II (insertion iterator) from pass-by-reference to pass-by-value
////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -