[ create a new paste ] login | about

Link: http://codepad.org/YK6uDHDq    [ raw code | output | fork ]

C++, pasted on Feb 9:
/* you can hate me later for the iterator abuse */

#include <iostream>
#include <stdexcept>
#include <map>
#include <cstdio>

template<typename NameT, typename ValueT> class Map {
    public:
        class Proxy {
            private:
                Map& m;
                NameT k;
                friend class Map;

                Proxy(Map& m, const NameT& k): m(m), k(k)
                {
                }

            public:
                operator ValueT() const
                {
                    return m.get(k);
                }

                ValueT operator&() const
                {
                    return m.get(k);
                }

                Proxy& operator=(const ValueT& v)
                {
                    m.insert(k, v);
                    return *this;
                }
        };


    private:
        std::map<NameT, ValueT> m_realmap;

    public:
        Map()
        {
        }

        Map& insert(const NameT& name, const ValueT& value)
        {
            m_realmap[name] = value;
            return *this;
        }

        ValueT& get(const NameT& name)
        {
            return m_realmap[name];
        }

        Proxy operator[] (const NameT& k)
        {
            return Proxy(*this, k);
        }

        NameT operator[] (int idx)
        {
            int count;
            typename std::map<NameT, ValueT>::const_iterator iter;
            for(count=0,iter=m_realmap.begin();iter!=m_realmap.end();iter++,count++)
            {
                if(count == idx)
                {
                    return iter->first;
                }
            }
            throw std::runtime_error("out of range");
            /* never reached, is undefined behaviour anyway*/
            return (m_realmap.end())->first;
        }

        int size()
        {
            return m_realmap.size();
        }
};


int main()
{
    Map<const char*, const char*> names;
    names["hello"] = "world";
    names["foo"] = "bar";
    for(int i=0; i<names.size(); i++)
    {
        printf("%s => %s\n", names[i], &names[names[i]]);
    }
}


Output:
1
2
hello => world
foo => bar


Create a new paste based on this one


Comments: