Boost logo

Boost :

From: Bill Wade (bill.wade_at_[hidden])
Date: 2000-09-14 16:28:35


> From: William Kempf [mailto:sirwillard_at_[hidden]]

> unsafe_lock<> isn't that tricky.

The first version posted wasn't portable. It assumed that an array of char
would be suitably aligned for a safe lock. In practice you can probably
force alignment with a union, and verify (at compile time) that you were
successful with alignment_of. However I do believe that is at least
moderately "tricky."

Perhaps some ambitious soul can give us

  alignment_of<T>::pod_type

that would, for-instance, return double if the alignment_of<T> and
alignment_of<double> were the same.

With that you can write a non-heap container that holds zero or one
properly aligned and constructed instances of a type.

  template<class T> class Tpot
  {
  public:
    Tpot(){}
    T& object(){ return reinterpret_cast<T&>(object_space); }
    const T& object() const
    { return reinterpret_cast<const T&>(object_space); }

    // Are these const? For now I'll say no.
    void construct(){ new((void*)object()) T; }
    void destruct(){ object().~T(); }

  private:
    // Let derived classes implement these if they wish.
    // Not implemented here.
    Tpot(const Tpot&);
    void operator=(const Tpot&);

    union // anonymous
    {
      char object_space[sizeof(T)];
      typename alignment_of<T>::pod_type alignment;
    };
  };


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk