1// -*- C++ -*- 2 3// Copyright (C) 2005 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 2, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// As a special exception, you may use this file as part of a free software 22// library without restriction. Specifically, if other files instantiate 23// templates or use macros or inline functions from this file, or you compile 24// this file and link it with other files to produce an executable, this 25// file does not by itself cause the resulting executable to be covered by 26// the GNU General Public License. This exception does not however 27// invalidate any other reasons why the executable file might be covered by 28// the GNU General Public License. 29 30// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. 31 32// Permission to use, copy, modify, sell, and distribute this software 33// is hereby granted without fee, provided that the above copyright 34// notice appears in all copies, and that both that copyright notice and 35// this permission notice appear in supporting documentation. None of 36// the above authors, nor IBM Haifa Research Laboratories, make any 37// representation about the suitability of this software for any 38// purpose. It is provided "as is" without express or implied warranty. 39 40/** 41 * @file mapping_level_example.cpp 42 * A basic example showing how to use different mapping levels. 43 */ 44 45// For cout, endl. 46#include <iostream> 47// For various associative containers. 48#include <ext/pb_assoc/assoc_cntnr.hpp> 49// For compound_data_type. 50#include <ext/pb_assoc/data_type.hpp> 51// For sting. 52#include <string> 53// For assert. 54#include <cassert> 55// For unary_function. 56#include <functional> 57 58typedef std::string user_name; 59 60typedef unsigned long machine_id; 61 62typedef std::string process_name; 63 64typedef float running_time; 65 66typedef 67pb_assoc::lu_assoc_cntnr< 68 process_name, 69 running_time> 70pr_name_rn_time_map; 71 72typedef 73pb_assoc::lu_assoc_cntnr< 74 machine_id, 75 pb_assoc::compound_data_type< 76 pr_name_rn_time_map> > 77machine_pr_map; 78 79typedef 80pb_assoc::lu_assoc_cntnr< 81 user_name, 82 pb_assoc::compound_data_type< 83 machine_pr_map> > 84user_machine_pr_map; 85 86typedef user_machine_pr_map::rebind<2>::other l2_t; 87 88typedef user_machine_pr_map::rebind<1>::other l1_t; 89 90struct is_same_proc : public std::unary_function< 91 l1_t::iterator::const_reference, 92 bool> 93{ 94 is_same_proc(const process_name& r_proc) : m_proc(r_proc) 95 { 96 97 }; 98 99 bool 100 operator()(l1_t::iterator::const_reference r_val) 101 { 102 return (r_val.first.second == m_proc); 103 } 104 105private: 106 process_name m_proc; 107}; 108 109int main() 110{ 111 user_machine_pr_map m; 112 113 /** 114 * Following shows different ways to insert into a user_machine_pr_map object. 115 **/ 116 117 // Josh launches on machine 1 firefox at time 1000. 118 119 m["Josh"][1]["firefox"] = 1000; 120 121 // Ben launches on machine 1 python at time 1003. 122 ((l1_t& )m)[std::make_pair( 123 std::make_pair("Ben", 1), 124 "python")] = 1003; 125 126 // Josh launches on machine 2 buggy at time 1004. 127 128 m.find("Josh")->second[2]["buggy"] = 1004; 129 130 // Sarah launches on machine 3 kdevelop at time 1010. 131 132 m["Sarah"][2].insert(std::make_pair("kdevelop", 1010)); 133 134 // Iterate over all users running applications. 135 136 { 137 std::cout << "All users running applications:" << std::endl; 138 139 user_machine_pr_map::const_iterator it = m.begin(); 140 141 while (it != m.end()) 142 std::cout << (it++)->first << std::endl; 143 } 144 145 // Sarah has terminated kdevelop 146 ((l1_t& )m).erase(std::make_pair( 147 std::make_pair("Sarah", 2), 148 "kdevelop")); 149} 150 151