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