[Mesa-dev] [PATCH 4/4] clover: remove util/compat

Tom Stellard tom at stellard.net
Wed Apr 29 08:32:38 PDT 2015


I've pushed this patch, thanks!

-Tom

On Wed, Apr 29, 2015 at 08:22:02AM +0200, EdB wrote:
> 
> ---
>  src/gallium/state_trackers/clover/Makefile.sources |   1 -
>  src/gallium/state_trackers/clover/api/program.cpp  |  14 +-
>  .../state_trackers/clover/core/compiler.hpp        |   4 +-
>  src/gallium/state_trackers/clover/core/error.hpp   |   2 -
>  src/gallium/state_trackers/clover/core/kernel.cpp  |   2 +-
>  src/gallium/state_trackers/clover/core/module.cpp  |  39 +--
>  src/gallium/state_trackers/clover/core/module.hpp  |  19 +-
>  src/gallium/state_trackers/clover/core/program.cpp |   2 +-
>  src/gallium/state_trackers/clover/core/program.hpp |   2 +-
>  .../state_trackers/clover/llvm/invocation.cpp      |  20 +-
>  .../state_trackers/clover/tgsi/compiler.cpp        |   5 +-
>  src/gallium/state_trackers/clover/util/compat.hpp  | 313
> ---------------------
>  12 files changed, 56 insertions(+), 367 deletions(-)
>  delete mode 100644 src/gallium/state_trackers/clover/util/compat.hpp
> 
> diff --git a/src/gallium/state_trackers/clover/Makefile.sources
> b/src/gallium/state_trackers/clover/Makefile.sources
> index 03eb754..fa96774 100644
> --- a/src/gallium/state_trackers/clover/Makefile.sources
> +++ b/src/gallium/state_trackers/clover/Makefile.sources
> @@ -45,7 +45,6 @@ CPP_SOURCES := \
>  	util/adaptor.hpp \
>  	util/algebra.hpp \
>  	util/algorithm.hpp \
> -	util/compat.hpp \
>  	util/factor.hpp \
>  	util/functional.hpp \
>  	util/lazy.hpp \
> diff --git a/src/gallium/state_trackers/clover/api/program.cpp
> b/src/gallium/state_trackers/clover/api/program.cpp
> index 913d195..e9b1f38 100644
> --- a/src/gallium/state_trackers/clover/api/program.cpp
> +++ b/src/gallium/state_trackers/clover/api/program.cpp
> @@ -23,6 +23,8 @@
>  #include "api/util.hpp"
>  #include "core/program.hpp"
> 
> +#include <sstream>
> +
>  using namespace clover;
> 
>  namespace {
> @@ -94,12 +96,12 @@ clCreateProgramWithBinary(cl_context d_ctx,
> cl_uint n,
>              return { CL_INVALID_VALUE, {} };
> 
>           try {
> -            compat::istream::buffer_t bin(p, l);
> -            compat::istream s(bin);
> +            std::stringbuf bin( { (char*)p, l } );
> +            std::istream s(&bin);
> 
>              return { CL_SUCCESS, module::deserialize(s) };
> 
> -         } catch (compat::istream::error &e) {
> +         } catch (std::istream::failure &e) {
>              return { CL_INVALID_BINARY, {} };
>           }
>        },
> @@ -279,10 +281,10 @@ clGetProgramInfo(cl_program d_prog,
> cl_program_info param,
> 
>     case CL_PROGRAM_BINARIES:
>        buf.as_matrix<unsigned char>() = map([&](const device &dev) {
> -            compat::ostream::buffer_t bin;
> -            compat::ostream s(bin);
> +            std::stringbuf bin;
> +            std::ostream s(&bin);
>              prog.binary(dev).serialize(s);
> -            return bin;
> +            return bin.str();
>           },
>           prog.devices());
>        break;
> diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp
> b/src/gallium/state_trackers/clover/core/compiler.hpp
> index 62c0f47..c68aa39 100644
> --- a/src/gallium/state_trackers/clover/core/compiler.hpp
> +++ b/src/gallium/state_trackers/clover/core/compiler.hpp
> @@ -23,14 +23,12 @@
>  #ifndef CLOVER_CORE_COMPILER_HPP
>  #define CLOVER_CORE_COMPILER_HPP
> 
> -#include "util/compat.hpp"
>  #include "core/error.hpp"
>  #include "core/module.hpp"
>  #include "pipe/p_defines.h"
> 
>  namespace clover {
> -   typedef compat::vector<std::pair<std::string,
> -                                       std::string> > header_map;
> +   typedef std::vector<std::pair<std::string, std::string> >
> header_map;
> 
>     module compile_program_llvm(const std::string &source,
>                                 const header_map &headers,
> diff --git a/src/gallium/state_trackers/clover/core/error.hpp
> b/src/gallium/state_trackers/clover/core/error.hpp
> index 805a0ec..eb65d62 100644
> --- a/src/gallium/state_trackers/clover/core/error.hpp
> +++ b/src/gallium/state_trackers/clover/core/error.hpp
> @@ -27,8 +27,6 @@
> 
>  #include <stdexcept>
> 
> -#include "util/compat.hpp"
> -
>  namespace clover {
>     class command_queue;
>     class context;
> diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp
> b/src/gallium/state_trackers/clover/core/kernel.cpp
> index 442762c..0756f06 100644
> --- a/src/gallium/state_trackers/clover/core/kernel.cpp
> +++ b/src/gallium/state_trackers/clover/core/kernel.cpp
> @@ -192,7 +192,7 @@
> kernel::exec_context::bind(intrusive_ptr<command_queue> _q,
>        if (st)
>           _q->pipe->delete_compute_state(_q->pipe, st);
> 
> -      cs.prog = msec.data.begin();
> +      cs.prog = &(msec.data[0]);
>        cs.req_local_mem = mem_local;
>        cs.req_input_mem = input.size();
>        st = q->pipe->create_compute_state(q->pipe, &cs);
> diff --git a/src/gallium/state_trackers/clover/core/module.cpp
> b/src/gallium/state_trackers/clover/core/module.cpp
> index f098b05..a6c5b98 100644
> --- a/src/gallium/state_trackers/clover/core/module.cpp
> +++ b/src/gallium/state_trackers/clover/core/module.cpp
> @@ -21,6 +21,7 @@
>  //
> 
>  #include <type_traits>
> +#include <iostream>
> 
>  #include "core/module.hpp"
> 
> @@ -33,20 +34,20 @@ namespace {
>     /// Serialize the specified object.
>     template<typename T>
>     void
> -   _proc(compat::ostream &os, const T &x) {
> +   _proc(std::ostream &os, const T &x) {
>        _serializer<T>::proc(os, x);
>     }
> 
>     /// Deserialize the specified object.
>     template<typename T>
>     void
> -   _proc(compat::istream &is, T &x) {
> +   _proc(std::istream &is, T &x) {
>        _serializer<T>::proc(is, x);
>     }
> 
>     template<typename T>
>     T
> -   _proc(compat::istream &is) {
> +   _proc(std::istream &is) {
>        T x;
>        _serializer<T>::proc(is, x);
>        return x;
> @@ -64,12 +65,12 @@ namespace {
>     struct _serializer<T, typename std::enable_if<
>                              std::is_scalar<T>::value>::type> {
>        static void
> -      proc(compat::ostream &os, const T &x) {
> +      proc(std::ostream &os, const T &x) {
>           os.write(reinterpret_cast<const char *>(&x), sizeof(x));
>        }
> 
>        static void
> -      proc(compat::istream &is, T &x) {
> +      proc(std::istream &is, T &x) {
>           is.read(reinterpret_cast<char *>(&x), sizeof(x));
>        }
> 
> @@ -81,11 +82,11 @@ namespace {
> 
>     /// (De)serialize a vector.
>     template<typename T>
> -   struct _serializer<compat::vector<T>,
> +   struct _serializer<std::vector<T>,
>                        typename std::enable_if<
>                           !std::is_scalar<T>::value>::type> {
>        static void
> -      proc(compat::ostream &os, const compat::vector<T> &v) {
> +      proc(std::ostream &os, const std::vector<T> &v) {
>           _proc<uint32_t>(os, v.size());
> 
>           for (size_t i = 0; i < v.size(); i++)
> @@ -93,7 +94,7 @@ namespace {
>        }
> 
>        static void
> -      proc(compat::istream &is, compat::vector<T> &v) {
> +      proc(std::istream &is, std::vector<T> &v) {
>           v.resize(_proc<uint32_t>(is));
> 
>           for (size_t i = 0; i < v.size(); i++)
> @@ -101,7 +102,7 @@ namespace {
>        }
> 
>        static void
> -      proc(module::size_t &sz, const compat::vector<T> &v) {
> +      proc(module::size_t &sz, const std::vector<T> &v) {
>           sz += sizeof(uint32_t);
> 
>           for (size_t i = 0; i < v.size(); i++)
> @@ -110,25 +111,25 @@ namespace {
>     };
> 
>     template<typename T>
> -   struct _serializer<compat::vector<T>,
> +   struct _serializer<std::vector<T>,
>                        typename std::enable_if<
>                           std::is_scalar<T>::value>::type> {
>        static void
> -      proc(compat::ostream &os, const compat::vector<T> &v) {
> +      proc(std::ostream &os, const std::vector<T> &v) {
>           _proc<uint32_t>(os, v.size());
> -         os.write(reinterpret_cast<const char *>(v.begin()),
> +         os.write(reinterpret_cast<const char *>(&v[0]),
>                    v.size() * sizeof(T));
>        }
> 
>        static void
> -      proc(compat::istream &is, compat::vector<T> &v) {
> +      proc(std::istream &is, std::vector<T> &v) {
>           v.resize(_proc<uint32_t>(is));
> -         is.read(reinterpret_cast<char *>(v.begin()),
> +         is.read(reinterpret_cast<char *>(&v[0]),
>                   v.size() * sizeof(T));
>        }
> 
>        static void
> -      proc(module::size_t &sz, const compat::vector<T> &v) {
> +      proc(module::size_t &sz, const std::vector<T> &v) {
>           sz += sizeof(uint32_t) + sizeof(T) * v.size();
>        }
>     };
> @@ -137,13 +138,13 @@ namespace {
>     template<>
>     struct _serializer<std::string> {
>        static void
> -      proc(compat::ostream &os, const std::string &s) {
> +      proc(std::ostream &os, const std::string &s) {
>           _proc<uint32_t>(os, s.size());
>           os.write(&s[0], s.size() * sizeof(std::string::value_type));
>        }
> 
>        static void
> -      proc(compat::istream &is, std::string &s) {
> +      proc(std::istream &is, std::string &s) {
>           s.resize(_proc<uint32_t>(is));
>           is.read(&s[0], s.size() * sizeof(std::string::value_type));
>        }
> @@ -209,12 +210,12 @@ namespace {
> 
>  namespace clover {
>     void
> -   module::serialize(compat::ostream &os) const {
> +   module::serialize(std::ostream &os) const {
>        _proc(os, *this);
>     }
> 
>     module
> -   module::deserialize(compat::istream &is) {
> +   module::deserialize(std::istream &is) {
>        return _proc<module>(is);
>     }
> 
> diff --git a/src/gallium/state_trackers/clover/core/module.hpp
> b/src/gallium/state_trackers/clover/core/module.hpp
> index 46112a3..9d65688 100644
> --- a/src/gallium/state_trackers/clover/core/module.hpp
> +++ b/src/gallium/state_trackers/clover/core/module.hpp
> @@ -23,7 +23,8 @@
>  #ifndef CLOVER_CORE_MODULE_HPP
>  #define CLOVER_CORE_MODULE_HPP
> 
> -#include "util/compat.hpp"
> +#include <vector>
> +#include <string>
> 
>  namespace clover {
>     struct module {
> @@ -40,14 +41,14 @@ namespace clover {
>           };
> 
>           section(resource_id id, enum type type, size_t size,
> -                 const compat::vector<char> &data) :
> +                 const std::vector<char> &data) :
>                   id(id), type(type), size(size), data(data) { }
>           section() : id(0), type(text), size(0), data() { }
> 
>           resource_id id;
>           type type;
>           size_t size;
> -         compat::vector<char> data;
> +         std::vector<char> data;
>        };
> 
>        struct argument {
> @@ -101,22 +102,22 @@ namespace clover {
> 
>        struct symbol {
>           symbol(const std::string &name, resource_id section,
> -                size_t offset, const compat::vector<argument> &args) :
> +                size_t offset, const std::vector<argument> &args) :
>                  name(name), section(section), offset(offset),
> args(args) { }
>           symbol() : name(), section(0), offset(0), args() { }
> 
>           std::string name;
>           resource_id section;
>           size_t offset;
> -         compat::vector<argument> args;
> +         std::vector<argument> args;
>        };
> 
> -      void serialize(compat::ostream &os) const;
> -      static module deserialize(compat::istream &is);
> +      void serialize(std::ostream &os) const;
> +      static module deserialize(std::istream &is);
>        size_t size() const;
> 
> -      compat::vector<symbol> syms;
> -      compat::vector<section> secs;
> +      std::vector<symbol> syms;
> +      std::vector<section> secs;
>     };
>  }
> 
> diff --git a/src/gallium/state_trackers/clover/core/program.cpp
> b/src/gallium/state_trackers/clover/core/program.cpp
> index 50ac01b..0d6cc40 100644
> --- a/src/gallium/state_trackers/clover/core/program.cpp
> +++ b/src/gallium/state_trackers/clover/core/program.cpp
> @@ -106,7 +106,7 @@ program::build_log(const device &dev) const {
>     return _logs.count(&dev) ? _logs.find(&dev)->second : "";
>  }
> 
> -const compat::vector<module::symbol> &
> +const std::vector<module::symbol> &
>  program::symbols() const {
>     if (_binaries.empty())
>        throw error(CL_INVALID_PROGRAM_EXECUTABLE);
> diff --git a/src/gallium/state_trackers/clover/core/program.hpp
> b/src/gallium/state_trackers/clover/core/program.hpp
> index 661fa03..183145e 100644
> --- a/src/gallium/state_trackers/clover/core/program.hpp
> +++ b/src/gallium/state_trackers/clover/core/program.hpp
> @@ -60,7 +60,7 @@ namespace clover {
>        std::string build_opts(const device &dev) const;
>        std::string build_log(const device &dev) const;
> 
> -      const compat::vector<module::symbol> &symbols() const;
> +      const std::vector<module::symbol> &symbols() const;
> 
>        unsigned kernel_ref_count() const;
> 
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index 2157909..7d2d941 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -340,11 +340,11 @@ namespace {
>        PM.run(*mod);
>     }
> 
> -   compat::vector<module::argument>
> +   std::vector<module::argument>
>     get_kernel_args(const llvm::Module *mod, const std::string
> &kernel_name,
>                     const clang::LangAS::Map &address_spaces) {
> 
> -      compat::vector<module::argument> args;
> +      std::vector<module::argument> args;
>        llvm::Function *kernel_func = mod->getFunction(kernel_name);
> 
>        llvm::DataLayout TD(mod);
> @@ -449,15 +449,16 @@ namespace {
> 
>        for (unsigned i = 0; i < kernels.size(); ++i) {
>           std::string kernel_name = kernels[i]->getName();
> -         compat::vector<module::argument> args =
> +         std::vector<module::argument> args =
>                 get_kernel_args(mod, kernel_name, address_spaces);
> 
>           m.syms.push_back(module::symbol(kernel_name, 0, i, args ));
>        }
> 
>        header.num_bytes = llvm_bitcode.size();
> -      std::string data;
> -      data.insert(0, (char*)(&header), sizeof(header));
> +      std::vector<char> data;
> +      data.insert(data.end(), (char*)(&header),
> +                              (char*)(&header) + sizeof(header));
>        data.insert(data.end(), llvm_bitcode.begin(),
>                                    llvm_bitcode.end());
>        m.secs.push_back(module::section(0, module::section::text,
> @@ -622,15 +623,16 @@ namespace {
> 
>        // Store the generated ELF binary in the module's text section.
>        header.num_bytes = code.size();
> -      std::string data;
> -      data.append((char*)(&header), sizeof(header));
> -      data.append(code.begin(), code.end());
> +      std::vector<char> data;
> +      data.insert(data.end(), (char*)(&header),
> +                              (char*)(&header) + sizeof(header));
> +      data.insert(data.end(), code.begin(), code.end());
>        m.secs.push_back(module::section(0, module::section::text,
>                                         header.num_bytes, data));
> 
>        for (std::map<std::string, unsigned>::iterator i =
> kernel_offsets.begin(),
>             e = kernel_offsets.end(); i != e; ++i) {
> -         compat::vector<module::argument> args =
> +         std::vector<module::argument> args =
>                 get_kernel_args(mod, i->first, address_spaces);
>           m.syms.push_back(module::symbol(i->first, 0, i->second,
> args ));
>        }
> diff --git a/src/gallium/state_trackers/clover/tgsi/compiler.cpp
> b/src/gallium/state_trackers/clover/tgsi/compiler.cpp
> index 9e959f7..b70104e 100644
> --- a/src/gallium/state_trackers/clover/tgsi/compiler.cpp
> +++ b/src/gallium/state_trackers/clover/tgsi/compiler.cpp
> @@ -40,7 +40,7 @@ namespace {
>           std::istringstream ts(line);
>           std::string name, tok;
>           module::size_t offset;
> -         compat::vector<module::argument> args;
> +         std::vector<module::argument> args;
> 
>           if (!(ts >> name))
>              continue;
> @@ -83,7 +83,8 @@ namespace {
>           throw build_error("translate failed");
> 
>        unsigned sz = tgsi_num_tokens(prog) * sizeof(tgsi_token);
> -      m.secs.push_back({ 0, module::section::text, sz, { (char
> *)prog, sz } });
> +      std::vector<char> data( (char *)prog, (char *)prog + sz );
> +      m.secs.push_back({ 0, module::section::text, sz, data });
>     }
>  }
> 
> diff --git a/src/gallium/state_trackers/clover/util/compat.hpp
> b/src/gallium/state_trackers/clover/util/compat.hpp
> deleted file mode 100644
> index dc06334..0000000
> --- a/src/gallium/state_trackers/clover/util/compat.hpp
> +++ /dev/null
> @@ -1,313 +0,0 @@
> -//
> -// Copyright 2012 Francisco Jerez
> -//
> -// Permission is hereby granted, free of charge, to any person
> obtaining a
> -// copy of this software and associated documentation files (the
> "Software"),
> -// to deal in the Software without restriction, including without
> limitation
> -// the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> -// and/or sell copies of the Software, and to permit persons to
> whom the
> -// Software is furnished to do so, subject to the following conditions:
> -//
> -// The above copyright notice and this permission notice shall be
> included in
> -// all copies or substantial portions of the Software.
> -//
> -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO
> EVENT SHALL
> -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> -// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
> OTHERWISE,
> -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
> USE OR
> -// OTHER DEALINGS IN THE SOFTWARE.
> -//
> -
> -#ifndef CLOVER_UTIL_COMPAT_HPP
> -#define CLOVER_UTIL_COMPAT_HPP
> -
> -#include <new>
> -#include <cstring>
> -#include <cstdlib>
> -#include <string>
> -#include <stdint.h>
> -
> -namespace clover {
> -   namespace compat {
> -      // XXX - For cases where we can't rely on STL...  I.e. the
> -      //       interface between code compiled as C++98 and C++11
> -      //       source.  Get rid of this as soon as everything can be
> -      //       compiled as C++11.
> -
> -      namespace detail {
> -         template<typename R, typename S>
> -         bool
> -         ranges_equal(const R &a, const S &b) {
> -            if (a.size() != b.size())
> -               return false;
> -
> -            for (size_t i = 0; i < a.size(); ++i)
> -               if (a[i] != b[i])
> -                  return false;
> -
> -            return true;
> -         }
> -      }
> -
> -      template<typename T>
> -      class vector {
> -      protected:
> -         static T *
> -         alloc(int n, const T *q, int m) {
> -            T *p = reinterpret_cast<T *>(std::malloc(n * sizeof(T)));
> -
> -            for (int i = 0; i < m; ++i)
> -               new(&p[i]) T(q[i]);
> -
> -            return p;
> -         }
> -
> -         static void
> -         free(int n, T *p) {
> -            for (int i = 0; i < n; ++i)
> -               p[i].~T();
> -
> -            std::free(p);
> -         }
> -
> -      public:
> -         typedef T *iterator;
> -         typedef const T *const_iterator;
> -         typedef T value_type;
> -         typedef T &reference;
> -         typedef const T &const_reference;
> -         typedef std::ptrdiff_t difference_type;
> -         typedef std::size_t size_type;
> -
> -         vector() : p(NULL), _size(0), _capacity(0) {
> -         }
> -
> -         vector(const vector &v) :
> -            p(alloc(v._size, v.p, v._size)),
> -            _size(v._size), _capacity(v._size) {
> -         }
> -
> -         vector(const_iterator p, size_type n) :
> -            p(alloc(n, p, n)), _size(n), _capacity(n) {
> -         }
> -
> -         template<typename C>
> -         vector(const C &v) :
> -            p(alloc(v.size(), NULL, 0)), _size(0),
> -            _capacity(v.size()) {
> -            for (typename C::const_iterator it = v.begin(); it !=
> v.end(); ++it)
> -               new(&p[_size++]) T(*it);
> -         }
> -
> -         ~vector() {
> -            free(_size, p);
> -         }
> -
> -         vector &
> -         operator=(const vector &v) {
> -            free(_size, p);
> -
> -            p = alloc(v._size, v.p, v._size);
> -            _size = v._size;
> -            _capacity = v._size;
> -
> -            return *this;
> -         }
> -
> -         bool
> -         operator==(const vector &v) const {
> -            return detail::ranges_equal(*this, v);
> -         }
> -
> -         void
> -         reserve(size_type n) {
> -            if (_capacity < n) {
> -               T *q = alloc(n, p, _size);
> -               free(_size, p);
> -
> -               p = q;
> -               _capacity = n;
> -            }
> -         }
> -
> -         void
> -         resize(size_type n, T x = T()) {
> -            if (n <= _size) {
> -               for (size_type i = n; i < _size; ++i)
> -                  p[i].~T();
> -
> -            } else {
> -               reserve(n);
> -
> -               for (size_type i = _size; i < n; ++i)
> -                  new(&p[i]) T(x);
> -            }
> -
> -            _size = n;
> -         }
> -
> -         void
> -         push_back(const T &x) {
> -            reserve(_size + 1);
> -            new(&p[_size]) T(x);
> -            ++_size;
> -         }
> -
> -         size_type
> -         size() const {
> -            return _size;
> -         }
> -
> -         size_type
> -         capacity() const {
> -            return _capacity;
> -         }
> -
> -         iterator
> -         begin() {
> -            return p;
> -         }
> -
> -         const_iterator
> -         begin() const {
> -            return p;
> -         }
> -
> -         iterator
> -         end() {
> -            return p + _size;
> -         }
> -
> -         const_iterator
> -         end() const {
> -            return p + _size;
> -         }
> -
> -         reference
> -         operator[](size_type i) {
> -            return p[i];
> -         }
> -
> -         const_reference
> -         operator[](size_type i) const {
> -            return p[i];
> -         }
> -
> -      private:
> -         iterator p;
> -         size_type _size;
> -         size_type _capacity;
> -      };
> -
> -      template<typename T>
> -      class vector_ref {
> -      public:
> -         typedef T *iterator;
> -         typedef const T *const_iterator;
> -         typedef T value_type;
> -         typedef T &reference;
> -         typedef const T &const_reference;
> -         typedef std::ptrdiff_t difference_type;
> -         typedef std::size_t size_type;
> -
> -         vector_ref(iterator p, size_type n) : p(p), n(n) {
> -         }
> -
> -         template<typename C>
> -         vector_ref(C &v) : p(&*v.begin()), n(v.size()) {
> -         }
> -
> -         bool
> -         operator==(const vector_ref &v) const {
> -            return detail::ranges_equal(*this, v);
> -         }
> -
> -         size_type
> -         size() const {
> -            return n;
> -         }
> -
> -         iterator
> -         begin() {
> -            return p;
> -         }
> -
> -         const_iterator
> -         begin() const {
> -            return p;
> -         }
> -
> -         iterator
> -         end() {
> -            return p + n;
> -         }
> -
> -         const_iterator
> -         end() const {
> -            return p + n;
> -         }
> -
> -         reference
> -         operator[](int i) {
> -            return p[i];
> -         }
> -
> -         const_reference
> -         operator[](int i) const {
> -            return p[i];
> -         }
> -
> -      private:
> -         iterator p;
> -         size_type n;
> -      };
> -
> -      class istream {
> -      public:
> -         typedef vector_ref<const unsigned char> buffer_t;
> -
> -         class error {
> -         public:
> -            virtual ~error() {}
> -         };
> -
> -         istream(const buffer_t &buf) : buf(buf), offset(0) {}
> -
> -         void
> -         read(char *p, size_t n) {
> -            if (offset + n > buf.size())
> -               throw error();
> -
> -            std::memcpy(p, buf.begin() + offset, n);
> -            offset += n;
> -         }
> -
> -      private:
> -         const buffer_t &buf;
> -         size_t offset;
> -      };
> -
> -      class ostream {
> -      public:
> -         typedef vector<unsigned char> buffer_t;
> -
> -         ostream(buffer_t &buf) : buf(buf), offset(buf.size()) {}
> -
> -         void
> -         write(const char *p, size_t n) {
> -            buf.resize(offset + n);
> -            std::memcpy(buf.begin() + offset, p, n);
> -            offset += n;
> -         }
> -
> -      private:
> -         buffer_t &buf;
> -         size_t offset;
> -      };
> -
> -   }
> -}
> -
> -#endif
> -- 
> 2.3.6
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list