| 1826 | // using Google Test have exited when main() returns. |
| 1827 | template <typename T> |
| 1828 | class ThreadLocal : public ThreadLocalBase { |
| 1829 | public: |
| 1830 | ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {} |
| 1831 | explicit ThreadLocal(const T& value) |
| 1832 | : default_factory_(new InstanceValueHolderFactory(value)) {} |
| 1833 | |
| 1834 | ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); } |
| 1835 | |
| 1836 | T* pointer() { return GetOrCreateValue(); } |
| 1837 | const T* pointer() const { return GetOrCreateValue(); } |
| 1838 | const T& get() const { return *pointer(); } |
| 1839 | void set(const T& value) { *pointer() = value; } |
| 1840 | |
| 1841 | private: |
| 1842 | // Holds a value of T. Can be deleted via its base class without the caller |
| 1843 | // knowing the type of T. |
| 1844 | class ValueHolder : public ThreadLocalValueHolderBase { |
| 1845 | public: |
| 1846 | ValueHolder() : value_() {} |
| 1847 | explicit ValueHolder(const T& value) : value_(value) {} |
| 1848 | |
| 1849 | T* pointer() { return &value_; } |
| 1850 | |
| 1851 | private: |
| 1852 | T value_; |
| 1853 | GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); |
| 1854 | }; |
| 1855 | |
| 1856 | |
| 1857 | T* GetOrCreateValue() const { |
| 1858 | return static_cast<ValueHolder*>( |
| 1859 | ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer(); |
| 1860 | } |
| 1861 | |
| 1862 | virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const { |
| 1863 | return default_factory_->MakeNewHolder(); |
| 1864 | } |
| 1865 | |
| 1866 | class ValueHolderFactory { |
| 1867 | public: |
| 1868 | ValueHolderFactory() {} |
| 1869 | virtual ~ValueHolderFactory() {} |
| 1870 | virtual ValueHolder* MakeNewHolder() const = 0; |
| 1871 | |
| 1872 | private: |
| 1873 | GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory); |
| 1874 | }; |
| 1875 | |
| 1876 | class DefaultValueHolderFactory : public ValueHolderFactory { |
| 1877 | public: |
| 1878 | DefaultValueHolderFactory() {} |
| 1879 | virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); } |
| 1880 | |
| 1881 | private: |
| 1882 | GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); |
| 1883 | }; |
| 1884 | |
| 1885 | class InstanceValueHolderFactory : public ValueHolderFactory { |