map.h
Go to the documentation of this file.
00001 /* 00002 * Copyright 2006-2009 Savarese Software Research Corporation 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * https://www.savarese.com/software/ApacheLicense-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00022 #ifndef __SSRC_WSPR_LUA_MAP_H 00023 #define __SSRC_WSPR_LUA_MAP_H 00024 00025 #include <ssrc/wispers/lua/lua.h> 00026 00027 __BEGIN_NS_SSRC_WSPR_LUA 00028 00029 template<typename container_type> 00030 void map_to_table(lua_State *state, const container_type & map) { 00031 typedef typename container_type::const_iterator const_iterator; 00032 00033 lua_newtable(state); 00034 00035 for(const_iterator && it = map.begin(), && end = map.end(); it != end;) { 00036 const_iterator value = it++; 00037 00038 if(it != end && value->first == it->first) { 00039 int pos = 0; 00040 00041 push_value(state, value->first); 00042 lua_newtable(state); 00043 00044 // We assume equivalent keys are contiguous. 00045 do { 00046 push_value(state, value->second); 00047 lua_rawseti(state, -2, ++pos); 00048 ++value; 00049 } while(value != end && value->first == it->first); 00050 00051 lua_settable(state, -3); 00052 it = value; 00053 } else { 00054 set_field(state, -1, value->second, value->first); 00055 } 00056 } 00057 } 00058 00059 __END_NS_SSRC_WSPR_LUA 00060 00061 #endif
Copyright © 2006-2011 Savarese Software Research Corporation. All rights reserved.