// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "weak_ptr_factory.h"

namespace should_succeed {

class OnlyMember {
  base::WeakPtrFactory<OnlyMember> factory_;
};

class FactoryLast {
  bool bool_member_;
  int int_member_;
  base::WeakPtrFactory<FactoryLast> factory_;
};

class FactoryRefersToOtherType {
  bool bool_member_;
  base::WeakPtrFactory<bool> bool_ptr_factory_;
};

class FirstFactoryRefersToOtherType {
  bool bool_member_;
  base::WeakPtrFactory<bool> bool_ptr_factory_;
  int int_member_;
  base::WeakPtrFactory<FirstFactoryRefersToOtherType> factory_;
};

class TwoFactories {
  bool bool_member_;
  int int_member_;
  base::WeakPtrFactory<TwoFactories> factory1_;
  base::WeakPtrFactory<TwoFactories> factory2_;
};

template <class T>
class ClassTemplate {
 public:
  ClassTemplate() : factory_(this) {}
 private:
  bool bool_member_;
  base::WeakPtrFactory<ClassTemplate> factory_;
};
// Make sure the template gets instantiated:
ClassTemplate<int> g_instance;

}  // namespace should_succeed

namespace should_fail {

class FactoryFirst {
  base::WeakPtrFactory<FactoryFirst> factory_;
  int int_member;
};

class FactoryMiddle {
  bool bool_member_;
  base::WeakPtrFactory<FactoryMiddle> factory_;
  int int_member_;
};

class TwoFactoriesOneBad {
  bool bool_member_;
  base::WeakPtrFactory<TwoFactoriesOneBad> factory1_;
  int int_member_;
  base::WeakPtrFactory<TwoFactoriesOneBad> factory2_;
};

template <class T>
class ClassTemplate {
 public:
  ClassTemplate() : factory_(this) {}
 private:
  base::WeakPtrFactory<ClassTemplate> factory_;
  bool bool_member_;
};
// Make sure the template gets instantiated:
ClassTemplate<int> g_instance;

}  // namespace should_fail

int main() {
}

