a5665e6ee1
[SVN r50320]
100 lines
2.3 KiB
C++
100 lines
2.3 KiB
C++
/* Boost.Flyweight example of use of key-value flyweights.
|
|
*
|
|
* Copyright 2006-2008 Joaquin M Lopez Munoz.
|
|
* Distributed under the Boost Software License, Version 1.0.
|
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
* http://www.boost.org/LICENSE_1_0.txt)
|
|
*
|
|
* See http://www.boost.org/libs/flyweight for library home page.
|
|
*/
|
|
|
|
#include <boost/array.hpp>
|
|
#include <boost/flyweight.hpp>
|
|
#include <boost/flyweight/key_value.hpp>
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
using namespace boost::flyweights;
|
|
|
|
/* A class simulating a texture resource loaded from file */
|
|
|
|
class texture
|
|
{
|
|
public:
|
|
texture(const std::string& filename):filename(filename)
|
|
{
|
|
std::cout<<"loaded "<<filename<<" file"<<std::endl;
|
|
}
|
|
|
|
texture(const texture& x):filename(x.filename)
|
|
{
|
|
std::cout<<"texture["<<filename<<"] copied"<<std::endl;
|
|
}
|
|
|
|
~texture()
|
|
{
|
|
std::cout<<"unloaded "<<filename<<std::endl;
|
|
}
|
|
|
|
const std::string& get_filename()const{return filename;}
|
|
|
|
// rest of the interface
|
|
|
|
private:
|
|
std::string filename;
|
|
};
|
|
|
|
/* key extractor of filename strings from textures */
|
|
|
|
struct texture_filename_extractor
|
|
{
|
|
const std::string& operator()(const texture& x)const
|
|
{
|
|
return x.get_filename();
|
|
}
|
|
};
|
|
|
|
/* texture flyweight */
|
|
|
|
typedef flyweight<
|
|
key_value<std::string,texture,texture_filename_extractor>
|
|
> texture_flyweight;
|
|
|
|
int main()
|
|
{
|
|
/* texture filenames */
|
|
|
|
const char* texture_filenames[]={
|
|
"grass.texture","sand.texture","water.texture","wood.texture",
|
|
"granite.texture","cotton.texture","concrete.texture","carpet.texture"
|
|
};
|
|
const int num_texture_filenames=
|
|
sizeof(texture_filenames)/sizeof(texture_filenames[0]);
|
|
|
|
/* create a massive vector of textures */
|
|
|
|
std::cout<<"creating flyweights...\n"<<std::endl;
|
|
|
|
std::vector<texture_flyweight> textures;
|
|
for(int i=0;i<50000;++i){
|
|
textures.push_back(
|
|
texture_flyweight(texture_filenames[std::rand()%num_texture_filenames]));
|
|
}
|
|
|
|
/* Just for the sake of making use of the key extractor,
|
|
* assign some flyweights with texture objects rather than strings.
|
|
*/
|
|
|
|
for(int j=0;j<50000;++j){
|
|
textures.push_back(
|
|
texture_flyweight(
|
|
textures[std::rand()%textures.size()].get()));
|
|
}
|
|
|
|
std::cout<<"\n"<<textures.size()<<" flyweights created\n"<<std::endl;
|
|
|
|
return 0;
|
|
}
|