[/
    Boost.Optional

    Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal

    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)
]


[section Examples]

[section Optional return values]

    optional<char> get_async_input()
    {
        if ( !queue.empty() )
            return optional<char>(queue.top());
        else return optional<char>(); // uninitialized
    }

    void receive_async_message()
    {
        optional<char> rcv ;
        // The safe boolean conversion from 'rcv' is used here.
        while ( (rcv = get_async_input()) && !timeout() )
            output(*rcv);
    }

[endsect]

[section Optional local variables]

    optional<string> name ;
    if ( database.open() )
    {
        name.reset ( database.lookup(employer_name) ) ;
    }
    else
    {
        if ( can_ask_user )
            name.reset ( user.ask(employer_name) ) ;
    }

    if ( name )
        print(*name);
    else print("employer's name not found!");

[endsect]

[section Optional data members]

    class figure
    {
        public:

        figure()
        {
            // data member 'm_clipping_rect' is uninitialized at this point.
        }

        void clip_in_rect ( rect const& rect )
        {
            ....
            m_clipping_rect.reset ( rect ) ; // initialized here.
        }

        void draw ( canvas& cvs )
        {
            if ( m_clipping_rect )
                do_clipping(*m_clipping_rect);

            cvs.drawXXX(..);
        }

        // this can return NULL.
        rect const* get_clipping_rect() { return get_pointer(m_clipping_rect); }

        private :

        optional<rect> m_clipping_rect ;

    };

[endsect]

[section Bypassing expensive unnecessary default construction]

    class ExpensiveCtor { ... } ;
    class Fred
    {
        Fred() : mLargeVector(10000) {}

        std::vector< optional<ExpensiveCtor> > mLargeVector ;
    } ;

[endsect]

[endsect]

 
