Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#ifndef GENERS_IOISCONTIGUOUS_HH_
#define GENERS_IOISCONTIGUOUS_HH_

#include <string>
#include <vector>

namespace gs {
  template <class T>
  struct IOIsContiguous {
    enum { value = 0 };
  };

  // String is treated as a pod vector. This will be guaranteed
  // to work correctly in the C++11 standard. The current standard
  // does not specify that the characters must be stored contuguously
  // inside the string -- however, this is always true in practice.
  template <class T, class Traits, class Alloc>
  struct IOIsContiguous<std::basic_string<T, Traits, Alloc>> {
    enum { value = 1 };
  };

  template <class T, class Traits, class Alloc>
  struct IOIsContiguous<const std::basic_string<T, Traits, Alloc>> {
    enum { value = 1 };
  };

  template <class T, class Traits, class Alloc>
  struct IOIsContiguous<volatile std::basic_string<T, Traits, Alloc>> {
    enum { value = 1 };
  };

  template <class T, class Traits, class Alloc>
  struct IOIsContiguous<const volatile std::basic_string<T, Traits, Alloc>> {
    enum { value = 1 };
  };

  // std::vector is used by the package everywhere. No point in not
  // having it here.
  template <class T, class Alloc>
  struct IOIsContiguous<std::vector<T, Alloc>> {
    enum { value = 1 };
  };

  template <class T, class Alloc>
  struct IOIsContiguous<const std::vector<T, Alloc>> {
    enum { value = 1 };
  };

  template <class T, class Alloc>
  struct IOIsContiguous<volatile std::vector<T, Alloc>> {
    enum { value = 1 };
  };

  template <class T, class Alloc>
  struct IOIsContiguous<const volatile std::vector<T, Alloc>> {
    enum { value = 1 };
  };

  // Hovever, std::vector<bool> should be excluded
  template <>
  struct IOIsContiguous<std::vector<bool>> {
    enum { value = 0 };
  };

  template <>
  struct IOIsContiguous<const std::vector<bool>> {
    enum { value = 0 };
  };

  template <>
  struct IOIsContiguous<volatile std::vector<bool>> {
    enum { value = 0 };
  };

  template <>
  struct IOIsContiguous<const volatile std::vector<bool>> {
    enum { value = 0 };
  };
}  // namespace gs

#endif  // GENERS_IOISCONTIGUOUS_HH_