/*
   I tried to modify the spaces when using casts like static_cast etc. by
   using sp_before_angle, sp_after_angle and sp_inside_angle. Even setting
   all of those options to remove results in the following:
 */

myvar = dynamic_cast<MyClass<T>*>(other);
// expected:
//myvar = dynamic_cast<MyClass<T>*>(other);

/*
   Sometime pointers and references are still not detected correctly in
   special cases - i guess.
 */
//When using "sp_before_ptr_star = remove" the result is:
typedef std::list<StreamedData*>::iterator iterator;
//typedef std::list<StreamedData *>::iterator iterator;
//------------------------------^ This space show not be there

typedef void (T::*Routine)(void);

//Similar with "sp_before_byref = remove":
unsigned long allocate(unsigned long size, void*& p);

//unsigned long allocate(unsigned long size, void* & p);
//------------------------------------------------^ The same here

void foo(void)
{
  List<byte> bob = new List<byte>();

  /* Align assignments */
  align_assign(chunk_get_head(),
               cpd.settings [UO_align_assign_span].n,
               cpd.settings [UO_align_assign_thresh].n);
}

Args::Args(int argc, char**argv)
{
  m_count = argc;
  m_values = argv;
  int len = (argc >> 3) + 1;
  m_used = new UINT8 [len];
  if (m_used != NULL) {
    memset(m_used, 0, len);
  }
}

void Args(int argc, char**argv)
{
  m_count = argc;
  m_values = argv;
  int len = (argc >> 3) + 1;
  m_used = new UINT8 [len];
  if (m_used != NULL) {
    memset(m_used, 0, len);
  }
}
