/*
 * program9-1.cc    TDDD38 2012-08-15
 */
#include <iostream>
#include <vector>

struct Stack_Policy
{
   template <typename T>  
   static void insert(const T& value, std::vector<T>& container)
   {
      container.insert(container.begin(), value);
   }

   template <typename T> 
   static T remove(std::vector<T>& container)
   {
      T value = container.front();
      container.erase(container.begin());
      return value;
   }
};

struct Queue_Policy
{
   template <typename T> 
   static void insert(const T& value, std::vector<T>& container)
   {
      container.insert(container.end(), value);
   }

   template <typename T> 
   static T remove(std::vector<T>& container)
   {
      T value = container.front();
      container.erase(container.begin());
      return value;
   }
};

template <typename T, class access_policy = Stack_Policy>
class RAC
{
public:
   void put(const T& value) { access_policy::insert(value, container_); }
   T    get()               { return access_policy::remove(container_); }
   void clear()             { container_.clear(); }

private:
   std::vector<T> container_;
};

int main()
{
   RAC<int, Stack_Policy> rac_stack;

   rac_stack.put(1);
   rac_stack.put(2);
   rac_stack.put(3);

   std::cout << rac_stack.get() << '\n';
   std::cout << rac_stack.get() << '\n';
   std::cout << rac_stack.get() << "\n\n";

   RAC<int, Queue_Policy> rac_queue;

   rac_queue.put(1);
   rac_queue.put(2);
   rac_queue.put(3);

   std::cout << rac_queue.get() << '\n';
   std::cout << rac_queue.get() << '\n';
   std::cout << rac_queue.get() << "\n\n";

   return 0;
}
