| /* 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; |
| } |