diff options
Diffstat (limited to 'src/base/varargs.hh')
-rw-r--r-- | src/base/varargs.hh | 308 |
1 files changed, 0 insertions, 308 deletions
diff --git a/src/base/varargs.hh b/src/base/varargs.hh deleted file mode 100644 index 87c98d006..000000000 --- a/src/base/varargs.hh +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (c) 2006 The Regents of The University of Michigan - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Nathan Binkert - */ - -#ifndef __BASE_VARARGS_HH__ -#define __BASE_VARARGS_HH__ - -#include "base/refcnt.hh" - -#define VARARGS_DECLARATION(receiver) \ - VarArgs::Argument<receiver> a01 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a02 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a03 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a04 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a05 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a06 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a07 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a08 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a09 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a10 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a11 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a12 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a13 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a14 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a15 = VarArgs::Null(), \ - VarArgs::Argument<receiver> a16 = VarArgs::Null() - -#define VARARGS_DEFINITION(receiver) \ - VarArgs::Argument<receiver> a01, \ - VarArgs::Argument<receiver> a02, \ - VarArgs::Argument<receiver> a03, \ - VarArgs::Argument<receiver> a04, \ - VarArgs::Argument<receiver> a05, \ - VarArgs::Argument<receiver> a06, \ - VarArgs::Argument<receiver> a07, \ - VarArgs::Argument<receiver> a08, \ - VarArgs::Argument<receiver> a09, \ - VarArgs::Argument<receiver> a10, \ - VarArgs::Argument<receiver> a11, \ - VarArgs::Argument<receiver> a12, \ - VarArgs::Argument<receiver> a13, \ - VarArgs::Argument<receiver> a14, \ - VarArgs::Argument<receiver> a15, \ - VarArgs::Argument<receiver> a16 - -#define VARARGS_ALLARGS \ - a01, a02, a03, a04, a05, a06, a07, a08, \ - a09, a10, a11, a12, a13, a14, a15, a16 - -#define VARARGS_ADDARGS(receiver) do { \ - do { \ - if (!a01) break; \ - a01.add_arg(receiver); \ - if (!a02) break; \ - a02.add_arg(receiver); \ - if (!a03) break; \ - a03.add_arg(receiver); \ - if (!a04) break; \ - a04.add_arg(receiver); \ - if (!a05) break; \ - a05.add_arg(receiver); \ - if (!a06) break; \ - a06.add_arg(receiver); \ - if (!a07) break; \ - a07.add_arg(receiver); \ - if (!a08) break; \ - a08.add_arg(receiver); \ - if (!a09) break; \ - a09.add_arg(receiver); \ - if (!a10) break; \ - a10.add_arg(receiver); \ - if (!a11) break; \ - a11.add_arg(receiver); \ - if (!a12) break; \ - a12.add_arg(receiver); \ - if (!a13) break; \ - a13.add_arg(receiver); \ - if (!a14) break; \ - a14.add_arg(receiver); \ - if (!a15) break; \ - a15.add_arg(receiver); \ - if (!a16) break; \ - a16.add_arg(receiver); \ - } while (0); \ - receiver.end_args(); \ -} while (0) - -namespace VarArgs { - -struct Null {}; - -template <typename T> -struct Traits -{ - enum { enabled = true }; -}; - -template <> -struct Traits<Null> -{ - enum { enabled = false }; -}; - -template <class RECV> -struct Base : public RefCounted -{ - virtual void add_arg(RECV &receiver) const = 0; -}; - -template <typename T, class RECV> -struct Any : public Base<RECV> -{ - const T &argument; - - Any(const T &arg) : argument(arg) {} - - virtual void - add_arg(RECV &receiver) const - { - receiver.add_arg(argument); - } -}; - -template <typename T, class RECV> -struct Any<T *, RECV> : public Base<RECV> -{ - const T *argument; - - Any(const T *arg) : argument(arg) {} - - virtual void - add_arg(RECV &receiver) const - { - receiver.add_arg(argument); - } -}; - -template <class RECV> -struct Argument : public RefCountingPtr<Base<RECV> > -{ - typedef RefCountingPtr<VarArgs::Base<RECV> > Base; - - Argument() { } - Argument(const Null &null) { } - template <typename T> - Argument(const T& arg) : Base(new Any<T, RECV>(arg)) { } - template <typename T> - Argument(const T* arg) : Base(new Any<T *, RECV>(arg)) { } - - void - add_arg(RECV &receiver) const - { - if (this->data) - this->data->add_arg(receiver); - } -}; - -template<class RECV> -class List -{ - public: - typedef VarArgs::Argument<RECV> Argument; - typedef std::list<Argument> list; - typedef typename list::iterator iterator; - typedef typename list::const_iterator const_iterator; - typedef typename list::size_type size_type; - - protected: - list l; - - public: - List() {} - List(Argument a01, Argument a02, Argument a03, Argument a04, - Argument a05, Argument a06, Argument a07, Argument a08, - Argument a09, Argument a10, Argument a11, Argument a12, - Argument a13, Argument a14, Argument a15, Argument a16) - { - if (!a01) return; - l.push_back(a01); - if (!a02) return; - l.push_back(a02); - if (!a03) return; - l.push_back(a03); - if (!a04) return; - l.push_back(a04); - if (!a05) return; - l.push_back(a05); - if (!a06) return; - l.push_back(a06); - if (!a07) return; - l.push_back(a07); - if (!a08) return; - l.push_back(a08); - if (!a09) return; - l.push_back(a09); - if (!a10) return; - l.push_back(a10); - if (!a11) return; - l.push_back(a11); - if (!a12) return; - l.push_back(a12); - if (!a13) return; - l.push_back(a13); - if (!a14) return; - l.push_back(a14); - if (!a15) return; - l.push_back(a15); - if (!a16) return; - l.push_back(a16); - } - - size_type size() const { return l.size(); } - bool empty() const { return l.empty(); } - - iterator begin() { return l.begin(); } - const_iterator begin() const { return l.begin(); } - - iterator end() { return l.end(); } - const_iterator end() const { return l.end(); } - - void - push_back(const Argument &arg) - { - if (arg) - l.push_back(arg); - } - - void - push_front(const Argument &arg) - { - if (arg) - l.push_front(arg); - } - - template <typename T> - void - push_back(const T &arg) - { - if (Traits<T>::enabled) - l.push_back(arg); - } - - template <typename T> - void - push_front(const T &arg) - { - if (Traits<T>::enabled) - l.push_front(arg); - } - - Argument& front() { return l.front(); } - const Argument& front() const { return l.front(); } - Argument& back() { return l.back(); } - const Argument& back() const { return l.back(); } - - void erase(iterator position) { return l.erase(position); } - void erase(iterator first, iterator last) { return l.erase(first, last); } - void clear() { return l.clear(); } - void pop_front() { return l.pop_front(); } - void pop_back() { return l.pop_back(); } - void reverse() { l.reverse(); } - - /* - * Functions specific to variable arguments - */ - void - add_args(RECV &recv) const - { - const_iterator i = l.begin(); - const_iterator end = l.end(); - while (i != end) { - i->add_arg(recv); - ++i; - } - - recv.end_args(); - } -}; - -} // namespace VarArgs - -#endif /* __BASE_VARARGS_HH__ */ |