TemplateCollectionModelEx, ObjectWrapperAndUnwrapper, DefaultObjectWrapper.useAdaptersForNonListCollections, SimpleNonListCollectionAdapter (see excerpts from the version history below), also some cleanup of the new SimpleXxxAdapter-s and some better test coverage:

- Added new, FTL type interface, freemarker.template.TemplateCollectionModelEx, which adds the size(), isEmpty(), and boolean contains(TemplateModel) methods to the TemplateCollectionModel interface. This was added because when wrapping java.util.Collections, these extra capabilities area available anyway, but FTL couldn't tap on them till now. While the exact interface details are marked as experimental, the feature itself is already utilized when setting the useAdaptersForNonListCollections property of DefaultObjectWrapper to true (see earlier).

- [When using DefaultObjectWrapper witch incompatible_improvements set to 2.3.22 or with its new useAdaptersForContainers setting set to true] At least until incompatible_improvements 2.4.0, java.util.Collection-s that aren't List-s (like Set-s) will continue using SimpleSequence (i.e., the copying approach) by default. This is because SimpleSequence gave indexed access to these non-List-s, like in mySet[2], which is strange but some existing templates may utilize this. To enable the more modern adapter approach, set DefaultObjectWrapper's useAdaptersForNonListCollections property to true. Then indexed access won't be possible for Set-s and such (note that ?size will still work), so you may want to retest old templates, but you get the advantages of the adapter approach. In new project it's highly recommended to set useAdaptersForNonListCollections to true.

- Added new interface, freemarker.template.ObjectWrapperAndUnwrapper. This extends ObjectWrapper with unwrapping functionality. This functionality has already existed for a long time in all BeansWrapper subclasses, like in DefaultObjectWrapper, but it wasn't factored out into its own published interface that other ObjectWrapper-s could implement too. This is useful for TemplateModel implementations that don't want to require a BeansWrapper (or its subclass), only the availability of the unwrapping functionality.